的非法使用
在pyspark中,我有两个数据范围,即DFA和DFB,带有复杂的模式。模式中的一个常见列是"时间"。我想制作一个新的数据框架,这是这两者的结合,以便我可以按时进行分类,但是我不想在原始数据范围内丢失任何东西。我不知道如何从原始数据范围之一中获取所有内容,并将其分组为新的结构类型。
也就是说,如果我有
# dfA
root
|--time
|--fieldA
|--fieldB
# dfB
root
|--time
|--fieldC
|--fieldD
我想创建一个具有模式的联合数据框架
# root
|--time
|--dfA
|--time
|--fieldA
|--fieldB
|--dfB
|--time
|--fieldC
|--fieldD
联盟结束后,DFA和DFB有时会取消
我想我可以通过执行
来定义常见模式common_schema = T.StructType([T.StructField('time', T.TimestampType()),
T.StructField('dfA', dfA.schema, True),
T.StructField('dfB', dfB.schema, True)])
,但随后我被卡在语法上,以便如何从数据框中选择所有内容作为列。我正在寻找
之类的东西commonA = dfA.select('time',
F.col('*').alias('dfA'))
commonB = dfB.select('time',
F.col('*').alias('dfB'))
common_df = commonA.union(commonB)
这是对'*'
选择数据框的所有列作为structtype
from pyspark.sql.functions import struct, lit
commonA = dfA.select("time", struct(*[c for c in df.columns]).alias("dfA"))
commonB = dfB.select("time", struct(*[c for c in df.columns]).alias("dfB"))
,但这不能如上所述结合。您可以:
commonA_ = commonA.select("time", "dfA", lit(None).cast(dfB.schema).alias("dfB"))
commonB_ = commonB.select("time", lit(None).cast(dfA.schema).alias("dfA"), "dfB")
commonA_.union(commonB_)
,但听起来您正在寻找更像外部加入
的东西dfA.alias("A").join(dfB.alias("B"), ["time"], "fullouter")