Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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 - Fatal编程技术网

Scala 分别处理spark中的多个目录

Scala 分别处理spark中的多个目录,scala,apache-spark,Scala,Apache Spark,我在HDFS中有一个目录列表,每个目录包含几个文件。我的目标是将一个目录中的所有文件合并到一个文件中,但要分别针对每个目录。在spark中,最快的方法是什么?按顺序迭代所有目录太慢。所以我想同时做。一种解决方案可能是使用线程池。也许有更好更快更地道的 谢谢 考虑以下测试目录foo和bar,其中包含以下文件: cat /tmp/foo/0.csv 4 cat /tmp/foo/1.csv 3 cat /tmp/bar/0.csv 7 我们可以使用以下代码片段阅读它们: val df = spar

我在HDFS中有一个目录列表,每个目录包含几个文件。我的目标是将一个目录中的所有文件合并到一个文件中,但要分别针对每个目录。在spark中,最快的方法是什么?按顺序迭代所有目录太慢。所以我想同时做。一种解决方案可能是使用线程池。也许有更好更快更地道的


谢谢

考虑以下测试目录
foo
bar
,其中包含以下文件:

cat /tmp/foo/0.csv
4
cat /tmp/foo/1.csv
3
cat /tmp/bar/0.csv
7
我们可以使用以下代码片段阅读它们:

val df = spark.read.csv("/tmp/foo", "/tmp/bar")
  .withColumn("dir", regexp_extract(input_file_name(), """([^/]*)/[^/]+\.csv$""", 1))
df.show()
/*
+---+---+
|_c0|dir|
+---+---+
|4  |foo|
|3  |foo|
|7  |bar|
+---+---+
*/
函数
input\u file\u name
给出了文件的绝对路径,因此我们可以使用它来获取目录。函数
regexp\u extract
仅用于转换,例如
/tmp/foo/1.csv->foo

Spark写入文件时,每个分区输出一个文件。因此,我们需要按列
dir
重新分区,以合并每个dir下的所有文件。最后,我们还可以使用
partitionBy
将目录名添加到输出文件结构中。比如说

df.repartition($"dir")
  .write
  .partitionBy("dir")
  .csv("/tmp/out")
将生成文件

/tmp/out/._SUCCESS.crc
/tmp/out/dir=bar/.part-00067-d780b550-785f-416c-b090-8d93694ba65c.c000.csv.crc
/tmp/out/dir=bar/part-00067-d780b550-785f-416c-b090-8d93694ba65c.c000.csv
/tmp/out/_SUCCESS
/tmp/out/dir=foo/part-00110-d780b550-785f-416c-b090-8d93694ba65c.c000.csv
/tmp/out/dir=foo/.part-00110-d780b550-785f-416c-b090-8d93694ba65c.c000.csv.crc
其中
/tmp/out/dir=bar/part-00067-d780b550-785f-416c-b090-8d93694ba65c.c000.csv
包含

7
4
3
/tmp/out/dir=foo/part-00110-d780b550-785f-416c-b090-8d93694ba65c.c000.csv
包含

7
4
3
如果没有定制的Hadoop
文件系统
类等,则无法将这些输出文件写入与原始输入相同的目录结构