Apache spark 使用pyspark在循环中附加Spark数据帧的有效方法

Apache spark 使用pyspark在循环中附加Spark数据帧的有效方法,apache-spark,pyspark,apache-spark-sql,pyspark-sql,pyspark-dataframes,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,Pyspark Dataframes,我有“|”分隔的巨大文本文件,我想合并所有文本文件并创建一个巨大的spark数据框,稍后将使用pyspark用于ETL过程 效率低下的方式 1) 创建一个空的spark数据帧df 2) 在循环中,将文本文件读取为spark dataframe df1,并将其附加到空spark dataframe df df = spark.createDataFrame([],schema) for x in os.listdir(textfiles_dir): filepath = '{}/{}'.f

我有“|”分隔的巨大文本文件,我想合并所有文本文件并创建一个巨大的spark数据框,稍后将使用pyspark用于ETL过程

效率低下的方式

1) 创建一个空的spark数据帧df

2) 在循环中,将文本文件读取为spark dataframe df1,并将其附加到空spark dataframe df

df = spark.createDataFrame([],schema)
for x in os.listdir(textfiles_dir):
    filepath = '{}/{}'.format(textfiles_dir,x)
    df1 = spark.read.format("csv") \
                    .option("header", "true") \
                    .option("delimiter", "|") \
                    .option("inferSchema","true") \
                    .load(filepath)
    df = df.union(df1)
这不是一种有效的点火方式

有人能提出一种有效的方法吗? 如果用示例代码进行解释,那就太好了

谢谢:)

  • df1=spark.read。加载(“pathFolder/”)-使用文件夹读取所有文件
  • df1另存为表数据库或文件
  • df1=spark.read。加载(“pathFolder/”)-使用文件夹读取所有文件
  • df1另存为表数据库或文件

  • 正如其他人所指出的,您将希望以数据帧的形式读取整个文本文件目录,而不是迭代读取每个目录:

    df = spark.read.format("csv") \
                        .option("header", "true") \
                        .option("delimiter", "|") \
                        .option("inferSchema","true") \
                        .load(textfiles_dir)
    
    如果您真的想使用union路径,我建议您使用SparkContext()中的
    union
    函数,而不是DataFrame中的union函数:

    dfs = []
    for x in os.listdir(textfiles_dir):
       filepath = '{}/{}'.format(textfiles_dir,x)
       df1 = spark.read.format("csv") \
                    .option("header", "true") \
                    .option("delimiter", "|") \
                    .option("inferSchema","true") \
                    .load(filepath)
       dfs.append(df1)
    df = spark.sparkContext.union(dfs)
    

    正如其他人所指出的,您将希望以数据帧的形式读取整个文本文件目录,而不是迭代读取每个目录:

    df = spark.read.format("csv") \
                        .option("header", "true") \
                        .option("delimiter", "|") \
                        .option("inferSchema","true") \
                        .load(textfiles_dir)
    
    如果您真的想使用union路径,我建议您使用SparkContext()中的
    union
    函数,而不是DataFrame中的union函数:

    dfs = []
    for x in os.listdir(textfiles_dir):
       filepath = '{}/{}'.format(textfiles_dir,x)
       df1 = spark.read.format("csv") \
                    .option("header", "true") \
                    .option("delimiter", "|") \
                    .option("inferSchema","true") \
                    .load(filepath)
       dfs.append(df1)
    df = spark.sparkContext.union(dfs)
    

    filepath=存在多个文件的目录的filepath


    dataframe=spark.read.format(“csv”).选项(“header”,“true”).选项(“delimiter”,“|”).加载(filepath)

    filepath=存在多个文件的目录的filepath


    dataframe=spark.read.format(“csv”).选项(“header”,“true”).选项(“delimiter”,“|”).加载(filepath)

    一次加载路径列表即全部加载路径列表即全部