Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
.. 2更多字段] scala>outDataDF.showfalse +--+----+---+--+ |id |姓名|金额|标签| +--+----+---+--+ |31 |斯科特| 3600 | C| |32 |巴纳比| 3700 | C| |20 |法案| 2500 | B| |21 |朱莉娅| 2600 | B| |1 |弗雷德| 600 | A| |2 |简| 700 | A| +--+----+---+--+_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

.. 2更多字段] scala>outDataDF.showfalse +--+----+---+--+ |id |姓名|金额|标签| +--+----+---+--+ |31 |斯科特| 3600 | C| |32 |巴纳比| 3700 | C| |20 |法案| 2500 | B| |21 |朱莉娅| 2600 | B| |1 |弗雷德| 600 | A| |2 |简| 700 | A| +--+----+---+--+

.. 2更多字段] scala>outDataDF.showfalse +--+----+---+--+ |id |姓名|金额|标签| +--+----+---+--+ |31 |斯科特| 3600 | C| |32 |巴纳比| 3700 | C| |20 |法案| 2500 | B| |21 |朱莉娅| 2600 | B| |1 |弗雷德| 600 | A| |2 |简| 700 | A| +--+----+---+--+,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,然后简单地写outDataDF而不是inDataDF。Spark并不是一个真正的框架,您可以直接开始使用它。我建议您花一点时间学习一些教程,以基本了解如何使用Spark,因为——正如下面的答案中提到的——你所做的并不是如何在Spark中做事,提供完整的教程有点超出StackOverflow的范围…@GlennieHellesSindholt我明白你的意思,我对Spark也有相当多的了解。如果您能分享您对如何解决此问题的想法,我们将不胜感激。我知道我可以提取所有数据,按项重新分区,然后编写转换并写

然后简单地写outDataDF而不是inDataDF。

Spark并不是一个真正的框架,您可以直接开始使用它。我建议您花一点时间学习一些教程,以基本了解如何使用Spark,因为——正如下面的答案中提到的——你所做的并不是如何在Spark中做事,提供完整的教程有点超出StackOverflow的范围…@GlennieHellesSindholt我明白你的意思,我对Spark也有相当多的了解。如果您能分享您对如何解决此问题的想法,我们将不胜感激。我知道我可以提取所有数据,按项重新分区,然后编写转换并写回最终结果。但这里的问题是,重新分区会导致混乱,我希望避免这种情况。因此,我的想法是,如果我可以在执行器中读取分区本身,那么就不需要洗牌了。我恐怕你在这里建议的解决方案表明了我对Spark的理解很差。嵌套数据帧很简单,在Spark中是不可能的。时期此外,如果你担心性能,为什么你甚至会考虑一个IO密集型选项?就性能而言,IO始终是最差的选择。当然,如果单靠转换无法实现目标,则只应使用洗牌步骤,但Spark是为高效处理洗牌而构建的。感谢@GlennieHellesSindholt的澄清。我知道我对Spark的理解很差,这就是为什么我在这里提出解决方案:。筑巢是不可能的,那么我认为我的想法本身是不正确的。那么我将用简单的方法继续前进。再次感谢!艰难的道路当然是无关紧要的。这种方法是不可行的。@GMc我知道你正在尝试这样做,我自己也尝试过。这是最简单的解决方案,读取、重新分区、转换、回写。但这里的问题是,当我读取所有项目的数据,然后进行重新分区时,会导致洗牌,这是非常昂贵的。为了避免这个问题,我的想法是,如果我可以从执行器本身读取每个分区,那么就不需要重新分区,洗牌也就消失了。简单地说,每个执行者都读取一些数据,对其进行转换并将其写回,而不进行任何洗牌。这在你提供的简单解决方案中是不可能的。我没有看到混乱。我看到一个FileScan和两个MapPartitions,一个在读,一个在写。当我读取所有项的数据并在Spark中按项重新分区时,会导致混乱,对吗?我想答案是这取决于。就我而言,我没有看到它。虽然洗牌可能是一个相对昂贵的步骤,但不要试图像瘟疫一样避免它。可能需要一次洗牌来启用或优化后续步骤。Spark不会的,不是吗?进行洗牌,除非它认为有充分的理由进行洗牌。连接就是一个很好的例子——在这种情况下,它应该洗牌较小的数据集以与较大的数据集对齐。在这种情况下,您基本上是在读写同一个数据集。因此,除非它严重倾斜,否则不应该有理由洗牌。
data
├── tag=A
│   └── data.csv
├── tag=B
│   └── data.csv
└── tag=C
    └── data.csv
id,name,amount
1,Fred,100
2,Jane,200
outData/
├── _SUCCESS
├── tag=A
│   └── part-00002-9e13ec13-7c63-4cda-b5af-e2d69cb76278.c000.csv
├── tag=B
│   └── part-00001-9e13ec13-7c63-4cda-b5af-e2d69cb76278.c000.csv
└── tag=C
    └── part-00000-9e13ec13-7c63-4cda-b5af-e2d69cb76278.c000.csv