如何使用pyspark在struct字段中添加可选列

sycxhyv7  于 2021-05-29  发布在  Spark
关注(0)|答案(0)|浏览(345)

我现在用这种方式创建了一个struct字段:

df = df.withColumn('my_struct', struct(
col('id').alias('id_test')
col('value').alias('value_test')
).alias('my_struct'))

我的想法是,现在我需要在我的结构中添加一个额外的字段,称为“optional”。此字段在退出时必须存在,在不存在时将其删除。像null/none这样的值不是选项。
到目前为止,我有两个不同的Dataframe,一个带有所需的值和column by id,另一个没有值/列和所有信息。

df_optional = df_optional.select('id','optional')
df = df.select('id','value','my_struct')

当df\u optional.id join df.join加上其余部分时,我想将可选值添加到df.my\u结构中。到目前为止,我有:

df_with_option = df.join(df_optional,on=['id'],how='inner') \
.withColumn('my_struct', struct(
    col('id').alias('id_test')
    col('value').alias('value_test')
    col(optional).alias('optional')
    ).alias('my_struct')).drop('optional')
df_without = df.join(df_optional,on=['id'],how='leftanti') # it already have my_struct

但是union应该有类似的列,这样我的代码就会中断。

df_result = df_without .unionByName(df_with_option)

我想合并这两个Dataframe,因为最后我编写了一个按id分区的json文件:

df_result.repartitionByRange(df_result.count(),df['id']).write.format('json').mode('overwrite').save('my_path')

当这些json文件有值时,它应该有“optional”列,否则它应该在模式之外。
任何帮助都将不胜感激。
--其他信息。
架构输入:

df_root
 |-- id: string (nullable = true)
 |-- optional: string (nullable = true)

df_optional
 |-- id: string (nullable = true)
 |-- value: string (nullable = true)
 |-- my_struct: struct (nullable = true)
 |    |-- id: string (nullable = true)
 |    |-- value: string (nullable = true)

架构输出:

df_result
 |-- id: string (nullable = true)
 |-- value: string (nullable = true)
 |-- my_struct: struct (nullable = true)
 |    |-- id: string (nullable = true)
 |    |-- value: string (nullable = true)
 |    |-- optional: string (nullable = true) (*)

(*)仅当它存在时。
--我认为这样做是不可能的。我可能需要保持这两个Dataframe的外观,只需写两次。像这样:

df_without.repartitionByRange(df_result.count(),df['id']).write.format('json').mode('overwrite').save('my_path')
df_with_option.repartitionByRange(df_result.count(),df['id']).write.format('json').mode('append').save('my_path')

然后我将以自己的方式在我的路径中拥有这些文件。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题