Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将Pyspark数据帧拆分为子集,应用函数并将输出写入多个文件_Python_Apache Spark_Pyspark_Apache Spark Sql_Pyspark Dataframes - Fatal编程技术网

Python 将Pyspark数据帧拆分为子集,应用函数并将输出写入多个文件

Python 将Pyspark数据帧拆分为子集,应用函数并将输出写入多个文件,python,apache-spark,pyspark,apache-spark-sql,pyspark-dataframes,Python,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Dataframes,我有一个固定宽度的文本文件,其中包含几个“表” 我想阅读它并用pyspark处理它。每个表都有自己的模式,因此我希望使用以下模式得出类似的结果: table1: col1 char(4) col2 char(5) col3 char(10) col4 int(3) table2: col1 char(19) 这意味着我希望以某种方式按第一列拆分/groupby,应用模式,然后写入不同的文件。 我所做的,是使用这个列表理解,但这当然不是并行的 ta

我有一个固定宽度的文本文件,其中包含几个“表”

我想阅读它并用pyspark处理它。每个表都有自己的模式,因此我希望使用以下模式得出类似的结果:

table1: col1 char(4)
        col2 char(5)
        col3 char(10)
        col4 int(3)
table2: col1 char(19)
这意味着我希望以某种方式按第一列拆分/groupby,应用模式,然后写入不同的文件。 我所做的,是使用这个列表理解,但这当然不是并行的

tables_list = [(table_name,apply_schema(df.filter(df['table']==table_name),table_name) for table_name in tables]
[table.write.format('parquet').save(f'PATH/{table_name}.parquet') for table_name,table in tables_list]
如何在并行写入文件的情况下一次性处理此问题

我还考虑过使用dataframe的partitionBy函数,但在编写之前,我无法确定是否可以应用
apply\u schema
函数

UDAF或window_函数是否能够处理分布式写操作

---编辑:

最简单的例子:

df = spark.createDataFrame(
    [
        ("table1", "dataneedsseparation154"),
        ("table1", "heresplitbadlyneedd432"),
        ("table2", "it'salwaysdifferent"),
    ],
    ('table', 'raw_string')
)
schema = {'table1':{'col1':(0,4),'col2':(5,5),'col3':(10,10),'col4':(20,3)},'table2':{'col1':(0,19)}}

def apply_schema(df,table_name):
  for column,(start,length) in schema[table_name].items():
    df = df.withColumn(column,df['raw_string'].substr(start,length))
  df = df.drop('raw_string')
  return df

result = [apply_schema(df.filter(df['table']==table),table) for table in schema.keys()]
期望输出:

spark.createDataFrame(
    [
        ("table1", "data","needs","separation","154"),
        ("table1", "here","split","badlyneedd","432")
    ],
    ('table', 'col1','col2','col3','col4')
).write.format('parquet').save('table1.parquet')
spark.createDataFrame(
    [
        ("table2", "it'salwaysdifferent"),
    ],
    ('table', 'col1')
).write.format('parquet').save('table2.parquet')

问题是如何从结果列表中获取拼花文件(以并行方式),或者上述方法是否是获取转换后的拼花文件的正确方法,并行化。

那么您将模式放入不同的文件中了吗?如果需要,您需要一种机制来将COL映射到Spark StructType,即char(12)->StringType、int->IntegerType等。还请提供所需的输出,如前所述,以便将架构映射到不同的文件中?如果是这样,您需要一种机制来将COL映射到Spark StructType,即char(12)->StringType、int->IntegerType等。另外,请提供所需的输出,如下所述
df = spark.createDataFrame(
    [
        ("table1", "dataneedsseparation154"),
        ("table1", "heresplitbadlyneedd432"),
        ("table2", "it'salwaysdifferent"),
    ],
    ('table', 'raw_string')
)
schema = {'table1':{'col1':(0,4),'col2':(5,5),'col3':(10,10),'col4':(20,3)},'table2':{'col1':(0,19)}}

def apply_schema(df,table_name):
  for column,(start,length) in schema[table_name].items():
    df = df.withColumn(column,df['raw_string'].substr(start,length))
  df = df.drop('raw_string')
  return df

result = [apply_schema(df.filter(df['table']==table),table) for table in schema.keys()]
spark.createDataFrame(
    [
        ("table1", "data","needs","separation","154"),
        ("table1", "here","split","badlyneedd","432")
    ],
    ('table', 'col1','col2','col3','col4')
).write.format('parquet').save('table1.parquet')
spark.createDataFrame(
    [
        ("table2", "it'salwaysdifferent"),
    ],
    ('table', 'col1')
).write.format('parquet').save('table2.parquet')