Чтение данных из нескольких файлов в один RDD или Dataframe - PullRequest
0 голосов
/ 30 сентября 2019

У меня 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...|
+---+---+---+-------------+----------------------+ 

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Я думаю, вы смотрите на файлы из локальной файловой системы. Можете ли вы включить детали того, что вы получаете в df? Запускаете ли вы spark в локальном режиме?

Если вы хотите попробовать виртуальную машину Cloudera, вы можете сделать что-то вроде этого, поместить два из этих 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

Для чтения имени файла и каталога вам может потребоваться сыграть с функциями split и input_file_name в зависимости от точного расположения файлов в HDFS.

Выможно добавить что-то, как показано ниже.

val df2 = df.withColumn("file_name", split(input_file_name(), "/").getItem(7).cast(StringType))

Аналогичным образом вы можете поиграть с input_file_name и, возможно, substr, чтобы получить входной каталог в зависимости от того, какую часть вы хотите.

0 голосов
/ 30 сентября 2019

Вы можете достичь этого, используя input_file_name с разделением и обратным чтением

несколько входных файлов

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|
+---------------+-------------------+

apply input_file_nameвстроенная функция для получения имени файла

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|
+---------------+-------------------+------------------------------------------+----------+-----------+

Раскомментируйте опущенный столбец, если вы не хотите, я просто оставлю для пояснения.

...