Как загрузить несколько CSV-файлов с перемешанными столбцами? - PullRequest
1 голос
/ 01 апреля 2019

У меня есть несколько CSV-файлов, которые я хочу загрузить в таблицу кустов, моя проблема в том, что последовательность заголовка моего CSV-файла не является фиксированной.

Если у меня есть два CSV-файла

sample1.csv 

  column1,column2
      "A","B"

и

sample2.csv

column2,column1
"A","B"

Я пытаюсь использовать приведенный ниже код.

spark.sql("drop table if exists faizan.sample")
val df = spark.read.format("csv").option("wholeFile", true).option("multiline",true).option("inferSchema", "true").option("header", true).option("escape","\"").csv("faizan/sample/sample/sample1.csv", "faizan/sample/sample/sample3.csv")
val newNames = Seq("column1","column2") 
val dfRenamed = df.toDF(newNames: _*)
    dfRenamed.createOrReplaceTempView("tempTable")
val tempDf = spark.sql("select * from tempTable where")
    tempDf.write.saveAsTable("faizan.sample")

Я получаю вывод:

+-------+-------+
|column1|column2|
+-------+-------+
|      A      B|
|      A      B|
+-------+-------+

Ожидаемый вывод:

+-------+-------+
|column1|column2|
+-------+-------+
|      A      B|
|      B      A|
+-------+-------+

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Возможно, приведенное ниже решение поможет решить вашу проблему

val df1 = spark.read.format.....(filepath1)
val df2 = spark.read.format.....(filepath2)

Импорт col метода из sql.fucntions

import org.apache.spark.sql.functions.col

, преобразование Seq (col_name1, col_name2) или Seq (String) в Seq (Column)

в основном df1.columns вернет имена столбцов Array [String].

, поэтому мы должны преобразовать Array [String] в Array [Column], как показано ниже

 val cols = df1.columns.map(e=>col(e))

, а затем выполнить union преобразование with selecting converted ordered cols of df1 в dataframe2

  df1.union(df2.select(cols:_*))
0 голосов
/ 01 апреля 2019

Хотелось бы, чтобы spark был настолько умен, чтобы разрешать неупорядоченные столбцы в разных файлах.

Попробуйте загрузить их один за другим, но вы всегда создаете 2 фрейма данных и объединяете их.

val dfReader = spark.read.format("csv").option("wholeFile", true).option("multiline",true).option("inferSchema", "true").option("header", true).option("escape","\"")

val df1 = dfReader.csv("faizan/sample/sample/sample1.csv")
val df2 = dfReader.csv("faizan/sample/sample/sample3.csv")

val df = df1.union(df2)

Другие вещи, которые вы можете попробовать, используя inferSchema как false, создать свою собственную схему как

StructType(Array(StructField("column1", StringType),StructField("column2", StringType)))
...