选择数据框的所有列作为结构类型



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

相关内容

  • 没有找到相关文章

最新更新