XML将一个结构体解释为数组。

0

【以下的问题经过翻译处理】 我已经尝试了一个星期,但是我开始放弃了——我需要一些帮助理解这个。我有一个S3存储桶,里面装满了XML文件,我正在创建一个pyspark ETL作业将它们转换为Parquet,以便我可以在Athena中查询它们。

在每个XML文件中,都有一个名为ORDER_LINE的XML标签。这个标签应该是一个项的数组,然而在许多文件中,只有一个项。XML没有数组的概念,因此当我将其传递到我的ETL作业中时,Glue将该字段解释为模式中的Choice类型,它可以是一个数组或一个结构类型。我需要始终将其强制转换为数组类型。这是我尝试的所有内容的列表:

  1. 使用ResolveChoice将其转换为数组。这不起作用,因为不能将结构体转换为数组。
  2. 进行ResolveChoice以“make_struct”为单位,然后使用Map.apply()步骤将其映射到字段,其中如果“struct”有数据,则将其转换为[struct]。这不起作用,Map文档暗示它不支持数组的python“map”函数。
  3. 将动态框架转换为数据框架,然后使用pyspark withColumn(when(struct.isNotNull, [struct]).otherwise(array))函数将结构体转换为数组,或使数组成为主对象,具体取决于哪个不为空。这不起作用,因为Glue正在推断结构体中的模式,而结构体中的字段顺序不同,因此虽然所有模式中的字段都相同,但Spark无法合并结果,因为模式不完全相同。
  4. 转换为数据框架,然后使用pyspark UDF来转换数据。这在小型的dev样本集上工作,但在
profile picture
EXPERTE
gefragt vor 5 Monaten3 Aufrufe
1 Antwort
0

【以下的回答经过翻译处理】 你好,我们又见面了,

我一直在测试建议的解决方案(仅使用您的 AWS 论坛 xml 示例数据)。如果将 Databrics XML 库添加到粘合中,则可以让库推断您的模式(在我的情况下,它有两个文件,一个包含数组,另一个不包含数组):

从 pyspark.sql 导入 SparkSession
从 pyspark.sql.types 导入 *

df =spark.read.format('xml').options(rowTag='indices').load('s3_dir')

df.show()
df.printSchema()

如果你想提前声明模式,它将与此类似。

my_new_schema = StructType([
    StructField('索引', ArrayType(StructType([
        StructField('indexname', StringType()),
        StructField('indexsymbol', StringType())
    ])))
])
df = spark.read.format('xml').options(rowTag='indices').load('s3_dir', schema = my_new_schema)


您需要将以下内容添加到 Glue Job 参数 Conf 中,以便将库添加到 Glue。

spark.jars.packages = com.databricks:spark-xml_2.12:0.13.0

最好的

profile picture
EXPERTE
beantwortet vor 5 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen