Python 将Pyspark数据帧拆分为子集,应用函数并将输出写入多个文件
我有一个固定宽度的文本文件,其中包含几个“表” 我想阅读它并用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
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')