Scala 将每个文件激发到数据集行
我在一个目录中有许多文件,每个文件包含跨多行的文本。 目前,我使用以下代码将所有这些文件读取到spark数据集(>2.0) 但是,这会创建一个数据集,其中每一行都是一行,而不是一个文件。我希望数据集中每行都有一个文件(作为字符串) 如何在不迭代每个文件并将其作为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
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")