我有 HMP数据集。这个数据集有14 个不同的文件夹(类别),每个类别都有多个 CSV 文件。
我想将所有 csv 文件中的数据读取到单个数据帧中。数据架构是
val Tschema = StructType(Array(
StructField("X", IntegerType, true),
StructField("Y", IntegerType, nullable = true),
StructField("Z", IntegerType, true)
))
我另外我想向数据框添加另外两列。第一列包含包含当前 CSV 的文件夹(类别)的名称,第二列包含 CSV 文件的名称。
我试过下面的代码,但它不能正常工作。
val path = System.getProperty("user.home") + "/Desktop/HMP/*" // Path to all categories
val df =spark.sparkContext.wholeTextFiles(path)
df.toDF().show(5 , false)
我的代码的输出是
+----------------------------------------------------------------------+--------------------+
| _1| _2|
+----------------------------------------------------------------------+--------------------+
|Climb_stairs/Accelerometer-2012-06-06-14-13-20-climb_stairs-m7.txt |12 38 35 |
|Climb_stairs/Accelerometer-2012-06-06-14-13-20-climb_stairs-m7.txt |23 56 34 |
|Climb_stairs/Accelerometer-2012-06-06-14-13-20-climb_stairs-m7.txt |13 36 36 |
|Climb_stairs/Accelerometer-2012-06-06-14-13-20-climb_stairs-m7.txt |39 57 42 |
|Climb_stairs/Accelerometer-2012-06-06-14-13-20-climb_stairs-m7.txt |26 51 36 |
+----------------------------------------------------------------------+--------------------+
这里在第一列(_1)之前\是我想要在单独列类上的部分,其余部分将在列源中。在_2部分,我想应用我定义的架构。
我希望最终输出如下所示。
+---+---+---+--------------+---------------------+
| X| Y| Z| class| source|
+---+---+---+--------------+---------------------+
| 37| 34| 43| Climb_stairs|Accelerometer-2011...|
| 05| 39| 34| Climb_stairs|Accelerometer-2011...|
| 30| 53| 49| Climb_stairs|Accelerometer-2011...|
+---+---+---+-------------+----------------------+
我认为您正在查看来自本地文件系统的文件。你能详细说明你得到了df
什么吗?你是在本地模式下运行 spark 吗?
如果您想尝试使用 Cloudera VM,您可以执行以下操作,按照以下步骤将其中两个 csv 文件放入 hdfs 位置
hdfs dfs -mkdir /files
hdfs dfs -put sample.csv sample2.csv /files/
运行火花
spark2-shell
val df = spark.read.csv("/files/")
df.show
对于读取文件名和目录,您可能需要根据 HDFS 上文件的确切位置来使用split
和使用input_file_name
函数。
您可以添加如下内容。
val df2 = df.withColumn("file_name", split(input_file_name(), "/").getItem(7).cast(StringType))
同样,您可以根据您想要的部分来使用input_file_name
并可能substr
抓取输入目录。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句