获取 Spark Scala rdd/dataframe 中所有文件和数据的路径

use*_*842 0 loops scala apache-spark

我有一个包含 100 多个子目录的目录。每个子目录都有一个文本文件。我想编写一个 Spark/scala 代码,将子目录名称附加到其中文件中的每个记录。

例如。

包含 /parent_dir/subdir1/file1->

abc|123

def|456
Run Code Online (Sandbox Code Playgroud)

包含 /parent_dir/subdir2/file1 ->

ghi|789
Run Code Online (Sandbox Code Playgroud)

包含 /parent_dir/subdir3/file1 ->

jkl|901
Run Code Online (Sandbox Code Playgroud)

所需的输出文件->

abc|123|subdir1

def|456|subdir1

ghi|789|subdir2

jkl|901|subdir3
Run Code Online (Sandbox Code Playgroud)

Sha*_*ala 7

您可以作为text文件读取并获取path文件,如下所示。

import org.apache.spark.sql.functions.input_file_name
val spark = SparkSession
  .builder()
  .appName("Test App")
  .master("local[1]")
  .getOrCreate()
import spark.implicits._

val data = spark.read.text("/parent_dir/*")
  .select(input_file_name().as("path"), $"value")
Run Code Online (Sandbox Code Playgroud)

现在您将数据作为数据框获取,其中包含path文件data

+--------------------------------+-------+
|path                            |value  |
+--------------------------------+-------+
|file:///parent_dir/subdir1/file1|abc|123|
|file:///parent_dir/subdir1/file1|def|456|
|file:///parent_dir/subdir3/file1|jkl|901|
|file:///parent_dir/subdir2/file1|ghi|789|
+--------------------------------+-------+
Run Code Online (Sandbox Code Playgroud)

现在您可以解析路径并仅获取所需的目录。

希望这可以帮助!