Scala 将多个文件中的数据读取到单个RDD或数据帧中
我正在吃HMP。此数据集有14个不同的文件夹类别,每个类别中有多个CSV文件 我希望将所有csv文件中的数据读取到单个数据帧中。数据的模式是Scala 将多个文件中的数据读取到单个RDD或数据帧中,scala,apache-spark,apache-spark-sql,rdd,Scala,Apache Spark,Apache Spark Sql,Rdd,我正在吃HMP。此数据集有14个不同的文件夹类别,每个类别中有多个CSV文件 我希望将所有csv文件中的数据读取到单个数据帧中。数据的模式是 val Tschema = StructType(Array( StructField("X", IntegerType, true), StructField("Y", IntegerType, nullable = true), StructField("Z", IntegerType, true) )) 我想在dataframe中再
val Tschema = StructType(Array(
StructField("X", IntegerType, true),
StructField("Y", IntegerType, nullable = true),
StructField("Z", IntegerType, true)
))
我想在dataframe中再添加两列。第一列包含包含当前CSV的foldercategory的名称,第二列包含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 |
+----------------------------------------------------------------------+--------------------+
这里的第一列_1before\是我希望位于单独的列类中的部分,其余部分将位于列源中。
在_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 如果您想在ClouderaVM上试用,您可以执行以下操作,将其中两个csv文件放入hdfs位置
hdfs dfs -mkdir /files
hdfs dfs -put sample.csv sample2.csv /files/
运行spark作为
spark2-shell
val df = spark.read.csv("/files/")
df.show
要读取文件名和目录,可能需要根据文件在HDFS上的确切位置使用拆分和输入文件名函数
您可以添加如下内容
val df2 = df.withColumn("file_name", split(input_file_name(), "/").getItem(7).cast(StringType))
类似地,您可以使用输入文件名和substr来获取输入目录,具体取决于您想要的部分
您可以通过使用带有拆分和反向读取的输入文件名来实现这一点
多输入文件
应用input\u file\u name内置函数获取文件名
取消注释删除列如果你不想我只是保留澄清 能否添加dataframe.showfalse选项以获取所需的数据source@MaheshGupta是,这将不会截断条目。但是我想要上面数据帧中提到的输出table@MaheshGupta我已经更新了问题和代码,请立即检查。此代码将提供CSV文件中的数据。另外,我还需要两列输出。其中一列包含CSV文件所在目录的名称,第二列包含CSV文件的名称。我已经更新了问题和代码。现在请检查。我已经相应地更新了我的答案。基本上,您需要使用“输入文件名”功能。
scala> var df_v = spark.read.format("csv").option("header",true).option("inferSchema",true).load("input_file/*.csv")
scala> df_v.show
+---------------+-------------------+
| id| DateTime|
+---------------+-------------------+
|340054675199675|15-01-2018 19:43:23|
|340054675199675|15-01-2018 10:56:43|
|340028465709212|10-01-2018 02:47:11|
|340054675199675|09-01-2018 10:59:10|
|340028465709212|02-01-2018 03:25:35|
|340054675199675|28-12-2017 05:48:04|
|340054675199675|21-12-2017 15:47:51|
|340028465709212|18-12-2017 10:33:04|
|340028465709212|16-12-2017 19:55:40|
|340028465709212|16-12-2017 19:55:40|
|340028465709212|12-12-2017 07:04:51|
|340054675199675|06-12-2017 08:52:38|
| 21000101| null|
| 20991231| null|
+---------------+-------------------+
scala> var df_v1 =df_v.withColumn("file",input_file_name).withColumn("folder",reverse(split($"file","/"))(1)).withColumn("filename",reverse(split($"file","/"))(0))//.drop("file")
scala> df_v1.show(false)
+---------------+-------------------+------------------------------------------+----------+-----------+
|id |DateTime |file |folder |filename |
+---------------+-------------------+------------------------------------------+----------+-----------+
|340054675199675|15-01-2018 19:43:23|file:///home/mahesh/input_file/test.csv |input_file|test.csv |
|340054675199675|15-01-2018 10:56:43|file:///home/mahesh/input_file/test.csv |input_file|test.csv |
|340028465709212|10-01-2018 02:47:11|file:///home/mahesh/input_file/test.csv |input_file|test.csv |
|340054675199675|09-01-2018 10:59:10|file:///home/mahesh/input_file/test.csv |input_file|test.csv |
|340028465709212|02-01-2018 03:25:35|file:///home/mahesh/input_file/test.csv |input_file|test.csv |
|340054675199675|28-12-2017 05:48:04|file:///home/mahesh/input_file/test.csv |input_file|test.csv |
|340054675199675|21-12-2017 15:47:51|file:///home/mahesh/input_file/test.csv |input_file|test.csv |
|340028465709212|18-12-2017 10:33:04|file:///home/mahesh/input_file/test.csv |input_file|test.csv |
|340028465709212|16-12-2017 19:55:40|file:///home/mahesh/input_file/test.csv |input_file|test.csv |
|340028465709212|16-12-2017 19:55:40|file:///home/mahesh/input_file/test.csv |input_file|test.csv |
|340028465709212|12-12-2017 07:04:51|file:///home/mahesh/input_file/test.csv |input_file|test.csv |
|340054675199675|06-12-2017 08:52:38|file:///home/mahesh/input_file/test.csv |input_file|test.csv |
|21000101 |null |file:///home/mahesh/input_file/so_date.csv|input_file|so_date.csv|
|20991231 |null |file:///home/mahesh/input_file/so_date.csv|input_file|so_date.csv|
+---------------+-------------------+------------------------------------------+----------+-----------+