Выбор полей структур внутри массива внутри фрейма данных - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть PySpark файл данных, загруженный из файла json.gz размером 3 ГБ, со следующей схемой:

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"))

Но мне нужен способ объединить articleID и источники в одном и том же struct. Как я могу это сделать?

1 Ответ

0 голосов
/ 07 ноября 2019

Хорошо, я нашел кое-что, что работает:

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"))

Но если у кого-то есть лучшее решение, я хотел бы услышать это, так как это кажется очень круглым. (И в качестве sidenote, collect_set, кажется, работает только с Java 8.)

...