簡體   English   中英

選擇數據框的所有列作為StructType

[英]Select all columns of a dataframe as a StructType

在pyspark中,我有兩個具有復雜架構的數據框dfA和dfB。 模式中的常見列是“時間”。 我想創建一個新的數據框,將兩者結合起來,以便我可以按時排序,但是我不想丟失任何原始數據框。 我無法弄清楚如何從原始數據幀之一中獲取所有內容並將其分組到新的並集structType中。

也就是說,如果我有

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM