Scala 如何一次将每个组发送给spark执行者?
我无法一次将每组数据帧发送给执行器 我在Scala 如何一次将每个组发送给spark执行者?,scala,apache-spark,apache-spark-sql,user-defined-functions,Scala,Apache Spark,Apache Spark Sql,User Defined Functions,我无法一次将每组数据帧发送给执行器 我在公司\u模型\u VAL\u df数据框中有如下数据 ---------------------------------------------------------------------------------------- | model_id | fiscal_year | fiscal_quarter | col1 | col2 | col3 | col4 | col5 | col6 | ----------------------
公司\u模型\u VAL\u df数据框中有如下数据
----------------------------------------------------------------------------------------
| model_id | fiscal_year | fiscal_quarter | col1 | col2 | col3 | col4 | col5 | col6 |
----------------------------------------------------------------------------------------
| 1 | 2018 | 1 | r1 | r2 | r3 | r4 | r5 | r6 |
| 1 | 2018 | 2 | r1 | r2 | r3 | r4 | r5 | r6 |
| 1 | 2018 | 1 | r1 | r2 | r3 | r4 | r5 | r6 |
| 1 | 2018 | 2 | r1 | r2 | r3 | r4 | r5 | r6 |
| 1 | 2018 | 1 | r1 | r2 | r3 | r4 | r5 | r6 |
| 2 | 2017 | 3 | r1 | r2 | r3 | r4 | r5 | r6 |
| 2 | 2017 | 1 | r1 | r2 | r3 | r4 | r5 | r6 |
| 2 | 2017 | 3 | r1 | r2 | r3 | r4 | r5 | r6 |
| 2 | 2017 | 3 | r1 | r2 | r3 | r4 | r5 | r6 |
| 2 | 2017 | 1 | r1 | r2 | r3 | r4 | r5 | r6 |
----------------------------------------------------------------------------------------
我想将每个分组的数据发送给executor,以便一次处理每个数据
为此,我做了如下工作:
var dist_company_model_vals_df = company_model_vals_df.select("model_id","fiscal_quarter","fiscal_year").distinct()
// Want to send each group at a time to write by executors.
dist_company_model_vals_df.foreach(rowDf => {
writeAsParquet(rowDf , parquet_file) // this simply writes the data as parquet file
})
错误:
这会引发NullPointerException,因为在执行器端找不到rowDf。使用Scala 2.11在spark sql中处理此问题的正确方法是什么
第2部分:问题
当我做公司模型价值df.groupBy(“模型id”、“会计季度”、“会计年度”)时,即使我增加了内存,数据仍大量溢出到磁盘上。也就是说,公司模型是一个巨大的数据帧。。。在进行groupBy时会发生很多溢出
以下情况相同,即使用partitionBy
公司模型日期写入分区依据(“模型id”、“会计季度”、“会计年度”)
PSEDO代码:
所以为了避免是第一个,我会做元组
val groups=公司模型val df.groupBy(“模型id”、“会计季度”、“会计年度”)。收集
有没有办法做这件事。
这里有对我有用的spark函数或API吗?
请建议解决此问题的方法。如果我正确理解您的问题,您希望分别处理每个“型号id”、“会计季度”、“会计年度”的数据。
如果这是正确的,您可以使用groupBy()
,例如:
company\u model\u vals\u df.groupBy(“model\u id”、“财政季度”、“财政年度”).agg(平均值($“col1”)为“平均值”)
如果您希望将每个逻辑组写入一个单独的文件夹,则可以通过以下方式实现:
company\u model\u vals\u df.write.partitionBy(“model\u id”、“财政季度”、“财政年度”).parquet(“path/to/save”)
如果我正确理解了您的问题,您希望分别处理每个“型号id”、“财政季度”、“财政年度”的数据。
如果这是正确的,您可以使用groupBy()
,例如:
company\u model\u vals\u df.groupBy(“model\u id”、“财政季度”、“财政年度”).agg(平均值($“col1”)为“平均值”)
如果您希望将每个逻辑组写入一个单独的文件夹,则可以通过以下方式实现:
company\u model\u vals\u df.write.partitionBy(“model\u id”、“财政季度”、“财政年度”).parquet(“path/to/save”)
这里几乎没有选项-
- 您需要将数据集分成多个数据集,并分别处理它们
像
var dist_company_model_vals_list=company_model_vals_df
.选择(“型号id”、“会计季度”、“会计年度”).distinct().collectAsList
然后过滤company\u model\u vals\u df
,输出dist\u company\u model\u vals\u list
列表,该列表提供了几个您可以独立工作的数据集,如
def行列表={
导入org.apache.spark.sql_
var-dfList:Seq[DataFrame]=Seq()
对于(数据这里几乎没有选项-
- 您需要将数据集分成多个数据集,并分别处理它们
像
var dist_company_model_vals_list=company_model_vals_df
.选择(“型号id”、“会计季度”、“会计年度”).distinct().collectAsList
然后过滤company\u model\u vals\u df
,输出dist\u company\u model\u vals\u list
列表,该列表提供了几个您可以独立工作的数据集,如
def行列表={
导入org.apache.spark.sql_
var-dfList:Seq[DataFrame]=Seq()
对于(数据)感谢您的快速响应。是的,希望分别处理每组“型号id”、“会计季度”、“会计年度”的数据。我必须创建每个集合并另存为拼花地板文件。如果我执行上面的groupBy,由于巨大的数据,它会将数据溢出到桌面并永远运行。@dytyniak你能看看我问的问题吗…我需要迭代每个不同的组,包括(“模型id”、“财政季度”、“财政年度”),需要形成一个单独的数据框,并将其作为此dist_company_model_vals_df.foreach(rowDf=>{writeAsParquet(rowDf,parquet_file)//这只是将数据作为parquet文件}写入writeAsParquet)@Shyam见上文谢谢。你能检查问题第2部分吗?谢谢你的快速回答。是的,想分别处理每套“型号id”、“会计季度”、“会计年度”的数据吗。我必须创建每个集合并另存为拼花地板文件。如果我执行上面的groupBy,由于巨大的数据,它会将数据溢出到桌面并永远运行。@dytyniak你能看看我问的问题吗…我需要迭代每个不同的组,包括(“模型id”、“财政季度”、“财政年度”),需要形成一个单独的数据框,并将其作为此dist_company_model_vals_df.foreach(rowDf=>{writeAsParquet(rowDf,parquet_file)//这只是将数据作为parquet文件}写入writeAsParquet)@Shyam见上文谢谢。你能检查问题第2部分吗?谢谢你收集了一个列表,但是列表项的迭代在哪里?下面只给出了第一组(“模型id”、“财政季度”、“财政年度”)选择记录,其余的记录呢?即公司模型VAL\U df.过滤器(col($“模型id”)。equalTo(dist_company_model_vals_list.get(0).getInt(0).and($“财政季度”).equalTo(dist_company_model_vals_list.get(0).getInt(1)))谢谢,在“list.zipWithIndex”中这个“列表”是从哪里来的?让我测试一下,itlist什么都不是,但是在上一条语句中计算的dist_company_model_vals_list更新了答案。您可能需要检查IDE中的语法并更正细微的更改。如果它解决了,请接受答案。它会抛出类似“value foreach不是java.util.list[org.apache.spark.sql.Row]的成员”这样的错误“zipWithIndex”方法。这会给val i=data.\u 2&val row=data.\u 1???带来什么?你能
groups.forEach{ group ->
// I want to prepare child dataframes for each group from company_model_vals_df
val child_df = company_model_vals_df.where(model_id= group.model_id && fiscal_quarter === group.fiscal_quarter && etc)
this child_df , i want wrote to a file i.e. saveAs(path)
}