web-dev-qa-db-ja.com

pysparkデータフレームが存在しない場合は列を追加します

さまざまなjsonファイルにjsonデータがあり、キーは行ごとに異なる場合があります。たとえば、

{"a":1 , "b":"abc", "c":"abc2", "d":"abc3"}
{"a":1 , "b":"abc2", "d":"abc"}
{"a":1 ,"b":"abc", "c":"abc2", "d":"abc3"}

列「b」、「c」、「d」、「f」のデータを集計したいのですが、指定されたjsonファイルには存在しませんが、他のファイルには存在する可能性があります。 SO列 'f'が存在しないため、その列には空の文字列を使用できます。

入力ファイルを読み込んで、このようにデータを集約しています

import pyspark.sql.functions as f
df =  spark.read.json(inputfile)
df2 =df.groupby("b","c","d","f").agg(f.sum(df["a"]))

これは私が欲しい最終出力です

{"a":2 , "b":"abc", "c":"abc2", "d":"abc3","f":"" }
{"a":1 , "b":"abc2", "c":"" ,"d":"abc","f":""}

誰か助けてくれますか?前もって感謝します!

8
gashu

列がデータフレームで利用可能かどうかを確認し、必要な場合にのみdfを変更できます。

if not 'f' in df.columns:
   df = df.withColumn('f', f.lit(''))

ネストされたスキーマでは、以下のようにdf.schemaを使用する必要がある場合があります。

>>> df.printSchema()
root
 |-- a: struct (nullable = true)
 |    |-- b: long (nullable = true)

>>> 'b' in df.schema['a'].dataType.names
True
>>> 'x' in df.schema['a'].dataType.names
False
13
Mariusz