pyspark 从 Dataframe 列表中创建单个 Dataframe

ecbunoof  于 2022-12-22  发布在  Spark
关注(0)|答案(1)|浏览(203)

我有一个 Dataframe 列表,在列表的每个位置上,我有一个 Dataframe ,我需要将所有这些 Dataframe 合并到一个 Dataframe 中。这将在使用之前在PySpark中完成

dataframe_new =pd.concat(listName)

溶液1

from pyspark.sql.types import *

import pyspark.sql

from pyspark.sql import SparkSession, Row

customSchema = StructType([

  StructField("col1",      StringType(), True),

  StructField("col2", StringType(), True),

  StructField("col3", StringType(), True),

  StructField("col4",  StringType(), True),

  StructField("col5", StringType(), True),

  StructField("col6",  StringType(), True),

  StructField("col7", StringType(), True)

])


df = spark.createDataFrame(queried_dfs[0],schema=customSchema)

解决方案2我尝试:(迭代 Dataframe 列表,但不知道如何合并它们

for x in ListOfDataframe
    new_df=union_all()

但这始终是创建一个new_df
能帮我解决吗

l0oc07j2

l0oc07j21#

即使列或列顺序不同,此函数也可用于组合 Dataframe 列表

def Zconcat(dfs):
    return reduce(lambda df1, df2: df1.union(df2.select(df1.columns)), dfs) 

def union_all(dfs):
    columns = reduce(lambda x, y : set(x).union(set(y)), [ i.columns for i in dfs ]  )

    for i in range(len(dfs)):
        d = dfs[i]
        for c in columns:
            if c not in d.columns:
                d = d.withColumn(c, lit(None))
        dfs[i] = d

    return Zconcat(dfs)

然后传递union_all一个 Dataframe 列表,例如

union_all([df1, df2, df3])

相关问题