在数据框内的数组内选择结构的字段

我从一个3 GB的json.gz文件中加载了一个PySpark数据帧,具有以下架构:

root
 |-- _id: long (nullable = false)
 |-- quote: string (nullable = true)
 |-- occurrences: array (nullable = true)
 |    |-- element: struct (containsnull = true)
 |    |    |-- articleID: string (nullable = true)
 |    |    |-- title: string (nullable = true)
 |    |    |-- date: string (nullable = true)
 |    |    |-- author: string (nullable = true)
 |    |    |-- source: string (nullable = true)

我需要删除标题,作者和日期字段,或创建一个不包含这些字段的新dataFrame

到目前为止,我已经设法获得以下架构:

root
 |-- _id: long (nullable = false)
 |-- quote: string (nullable = true)
 |-- occurrences: array (nullable = false)
 |    |-- element: struct (containsnull = false)
 |    |    |-- articleID: array (nullable = true)
 |    |    |    |-- element: string (containsnull = true)
 |    |    |-- source: array (nullable = true)
 |    |    |    |-- element: string (containsnull = true)

使用

df.select(df._id,df.quote,array(
          struct(
              col("occurrences.articleID"),col("occurrences.source")
          )
      ).alias("occurrences"))

但是我需要一种方法来将商品ID和来源保持在同一struct中。我该怎么办?

za80967190 回答:在数据框内的数组内选择结构的字段

好的,我发现了一些可行的方法:

clean_df = df.withColumn("exploded",explode("occurrences")).drop("occurrences")
            .select(
                df._id,df.quote,df.exploded.articleID.alias("articleID"),df.exploded.source.alias("source")
             )
    .withColumn("occs",struct(col("articleID"),col("source")))
    .groupBy("_id","quote").agg(collect_set("occs").alias("occurrences"))

但是,如果有人有更好的解决方案,我很想听听它,因为这似乎很简单。 (此外,collect_set似乎仅适用于Java 8。)

本文链接:https://www.f2er.com/3144680.html

大家都在问