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 将每个文件激发到数据集行_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 将每个文件激发到数据集行

Scala 将每个文件激发到数据集行,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我在一个目录中有许多文件,每个文件包含跨多行的文本。 目前,我使用以下代码将所有这些文件读取到spark数据集(>2.0) 但是,这会创建一个数据集,其中每一行都是一行,而不是一个文件。我希望数据集中每行都有一个文件(作为字符串) 如何在不迭代每个文件并将其作为RDD单独读取的情况下实现这一点?在SparkContext上使用wholeTextFiles() val rdd: RDD[(String, String)] = spark.sparkContext

我在一个目录中有许多文件,每个文件包含跨多行的文本。 目前,我使用以下代码将所有这些文件读取到spark数据集(>2.0)

但是,这会创建一个数据集,其中每一行都是一行,而不是一个文件。我希望数据集中每行都有一个文件(作为字符串)

如何在不迭代每个文件并将其作为
RDD
单独读取的情况下实现这一点?

SparkContext
上使用
wholeTextFiles()

val rdd: RDD[(String, String)] = spark.sparkContext
                                      .wholeTextFiles("file/path/to/read/as/rdd")
SparkContext.wholeTextFiles用于读取包含 多个小文本文件,并将每个文件返回为(文件名, 内容)成对。这与textFile相反,textFile将返回 每个文件中每行一条记录


@mrsrinivas答案的另一种选择是按
input\u file\u name
分组。鉴于结构:

evan@vbox>~/junk/so>查找。
.
./d2
./d2/t.txt
/d1
./d1/t.txt
evan@vbox>~/junk/so>cat*/*.txt
d1_1
d1_2
d2_1
d2_2
我们可以根据输入文件收集列表,如下所示:

scala>val-ddf=spark.read.textFile(“file:///home/evan/junk/so/*").
|选择($“值”,输入文件名为“fName”)
ddf:org.apache.spark.sql.DataFrame=[value:string,fName:string]
scala>ddf.show(false)
+-----+----------------------------------+
|值| fName|
+-----+----------------------------------+
|d2_1|file:///home/evan/junk/so/d2/t.txt|
|d2_2|file:///home/evan/junk/so/d2/t.txt|
|d1_1|file:///home/evan/junk/so/d1/t.txt|
|d1_2|file:///home/evan/junk/so/d1/t.txt|
+-----+----------------------------------+
scala>ddf.groupBy(“fName”).agg(collect_list($“value”)作为“value”)。
|放下(“fName”).show
+------------+
|价值观|
+------------+
|[d1_1,d1_2]|
|[d2_1,d2_2]|
+------------+

很好的答案,我一直在寻找。在
群组中使用
输入文件名
的好方法,我不知道该函数:)。尽管如此,@mrsrinivas的答案还是有点简洁。当然,我的答案一直都是
DataFrame
,但在这种情况下使用
RDD
会更好一些,但总有
toDF
功能。
val rdd: RDD[(String, String)] = spark.sparkContext
                                      .wholeTextFiles("file/path/to/read/as/rdd")