71

私には2つDataFrameのsがあります:

ソースデータ

私はこのような組合が必要です:

ここに画像の説明を入力

列のunionAll数と名前が異なるため機能しません。

これどうやってするの?

4

22 に答える 22

2
from functools import reduce
from pyspark.sql import DataFrame
import pyspark.sql.functions as F

def unionAll(*dfs, fill_by=None):
    clmns = {clm.name.lower(): (clm.dataType, clm.name) for df in dfs for clm in df.schema.fields}
    
    dfs = list(dfs)
    for i, df in enumerate(dfs):
        df_clmns = [clm.lower() for clm in df.columns]
        for clm, (dataType, name) in clmns.items():
            if clm not in df_clmns:
                # Add the missing column
                dfs[i] = dfs[i].withColumn(name, F.lit(fill_by).cast(dataType))
    return reduce(DataFrame.unionByName, dfs)
unionAll(df1, df2).show()
  1. 大文字と小文字を区別しない列
  2. 実際の列ケースを返します
  3. 既存のデータ型をサポート
  4. デフォルト値はカスタマイズ可能
  5. 一度に複数のデータフレームを渡す (例: unionAll(df1, df2, df3, ..., df10))
于 2021-03-26T11:04:54.817 に答える