我现在用这种方式创建了一个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')
然后我将以自己的方式在我的路径中拥有这些文件。
暂无答案!
目前还没有任何答案,快来回答吧!