![](/img/trans.png)
[英]How to generate a table with one row for each count of distinct possibilities from one column, including null?
[英]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.