Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Scala 如何一次将每个组发送给spark执行者?_Scala_Apache Spark_Apache Spark Sql_User Defined Functions - Fatal编程技术网

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)
}