簡體   English   中英

如何從 PySpark 中一個 DataFrame 的每一行生成,然后減少一組大量的 DataFrame?

[英]How to generate, then reduce, a massive set of DataFrames from each row of one DataFrame in PySpark?

不幸的是,我無法分享我的實際代碼或數據,因為它是專有的,但是如果讀者從文本中不清楚問題,我可以生成 MWE。

我正在處理一個包含約 5000 萬行的數據框,每行都包含一個大型 XML 文檔。 從每個 XML 文檔中,我提取了與標簽之間的出現次數和層次關系相關的統計信息列表(與未記錄的 XML 格式不同,這讓人們眼前一亮)。 我可以在數據幀中表達這些統計數據,並且可以使用 GROUP BY/SUM 和 DISTINCT 等標准操作將這些數據幀合並到多個文檔中。 目標是提取所有 5000 萬個文檔的統計信息,並將它們表達在單個數據框中。

問題是我不知道如何從 Spark 中一個數據幀的每一行有效地生成 5000 萬個數據幀,或者如何告訴 Spark 使用二元運算符將 5000 萬個數據幀的列表減少到一個數據幀。 有做這些事情的標准函數嗎?

到目前為止,我發現的唯一解決方法是非常低效(將數據存儲為字符串,解析它,進行計算,然后將其轉換回字符串)。 使用此方法需要數周才能完成,因此不切實際。

從每一行的每個 XML 響應中提取的數據和統計數據可以存儲在行本身的附加列中。 這樣,spark 應該能夠在其多個執行程序中執行流程以提高性能。 這是一個偽代碼。

from pyspark.sql.types import StructType, StructField, IntegerType, 
StringType, DateType, FloatType, ArrayType

def extract_mobile_metrics_from_json(row):
    j = row['xmlResponse'] # assuming your xml column name is xmlResponse
    # perform your xml extractions and computations for the xmlResponse in python
    ...
    load_date = ...
    stats_data1 = ...
    
    return Row(load_date, stats_data1, stats_data2, stats_group)

  
schema = schema = StructType([StructField('load_date', DateType()),
                     StructField('stats_data1', FloatType()),
                     StructField('stats_data2', ArrayType(IntegerType())),
                     StructField('stats_group', StringType())
                     ])
df_with_xml_stats = original_df.rdd\
                            .map(extract_metrics_from_xml)\
                            .toDF(schema=schema, sampleRatio=1)\
                            .cache()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM