Как прочитать текстовый файл с разделителями-пробелами и сохранить его в Hive?

У меня есть строка, как показано ниже. Первая строка - это заголовок, а остальные - значения столбца. Я хочу создать фрейм данных (Spark 1.6 и Java7) из String и преобразовать значения в col3 и col4 как DOUBLE.

col1 col2 col3 col4 col5
val1 val2 val3 val4 val5
val6 val7 val8 val9 val10
val11 val12 val13 val14 val15

После создания фрейма данных для вышеупомянутого у меня есть два поля, которые должны быть в первой строке, значения которых являются константами.

const1 const2 col1 col2 col3 col4 col5
const1 const2 val1 val2 val3 val4 val5
const1 const2 val6 val7 val8 val9 val10
const1 const2 val11 val12 val13 val14 val15

Я хочу записать приведенный выше фрейм данных в таблицу кустов со схемой (const1 int, const2 int, col1 double, col2 double, col3 double, col4 double, col5 double). Я использую Spark 1.6 и Java7.


person John Thomas    schedule 19.05.2017    source источник


Ответы (2)


Я настоятельно рекомендую использовать последнюю и лучшую версию Spark 2.1.1, который поддерживает файлы CSV из коробки.


Если я не ошибаюсь, поддержка CSV в Spark 1.6 осуществляется с помощью spark-csv. упаковка.

Запустите среду Spark с загруженным пакетом:

--packages com.databricks:spark-csv_2.11:1.5.0

и это дает вам поддержку формата CSV.

На домашней странице пакета:

SQLContext sqlContext = new SQLContext(sc);
DataFrame df = sqlContext.read()
    .format("com.databricks.spark.csv")  // <-- enables csv support in Spark SQL
    .option("inferSchema", "true")
    .option("header", "true")
    .load("cars.csv");

Вам придется использовать параметр delimiter, поскольку по умолчанию используется запятая.

разделитель по умолчанию столбцы разделяются с помощью ,, но delimiter может быть установлен на любой символ

Загрузив файл как DataFrame, вы можете добавить постоянные столбцы, используя метод DataFrame.withColumn:

public DataFrame withColumn(String colName, Column col)

Возвращает новый DataFrame, добавляя столбец или заменяя существующий столбец с тем же именем.

После этого для сохранения в Hive достаточно использовать метод write() вашего SQLContext и:

write().saveAsTable(tableName)

См. DataFrame API.

person Jacek Laskowski    schedule 19.05.2017

Поскольку у вас есть все необходимые данные в файле, а столбцы, которые вы хотите добавить, являются константами, это также можно сделать с помощью простого класса case и createDataFrame в Scala. Предоставление решения, связанного с scala, которое может помочь вам понять, как вы должны подходить к решению

case class schema (const1: Int, const2: Int, col1: String, col2: String, col3: String, col4: String, col5: String)
//Skip Header while loading the data
val fileRDD = sc.textFile("file")
                .mapPartitionsWithIndex{ (index, row) => if (index==0) row.drop(1) else row }
                .map(x => x.split(" "))
                .map(x => schema(1, 2, x(0), x(1), x(2), x(3), x(4) ))
val df = sqlContext.createDataFrame(fileRDD)
df.show()    
+------+------+-----+-----+-----+-----+-----+
|const1|const2| col1| col2| col3| col4| col5|
+------+------+-----+-----+-----+-----+-----+
|     1|     2| col1| col2| col3| col4| col5|
|     1|     2| val1| val2| val3| val4| val5|
|     1|     2| val6| val7| val8| val9|val10|
|     1|     2|val11|val12|val13|val14|val15|
+------+------+-----+-----+-----+-----+-----+

И загрузка данных в улей, как упомянул Яцек:

После этого для сохранения в Hive достаточно использовать метод write () вашего SQLContext и:

write().saveAsTable(tableName)

См. DataFrame API.

person philantrovert    schedule 19.05.2017