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
专家
已提问 5 个月前0 查看次数
1 回答
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
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则