2015-10-28 5 views
2

Я новичок в Hadoop, и я использую кластер с одним узлом (для разработки), чтобы вытащить некоторые данные из реляционной базы данных.Write Hive Table, используя Spark SQL и JDBC

В частности, я использую Spark (версия 1.4.1), API Java, чтобы извлекать данные для запроса и писать в Hive. Я столкнулся с различными проблемами (и прочитал руководства и попробовал поиск в Интернете), но я думаю, что я мог бы не понимать какую-то фундаментальную часть этого, потому что у меня проблемы.

Во-первых, я думал, что смогу прочитать данные в Spark, возможно, запустить некоторые методы Spark для управления данными, а затем записать их в Hive через объект HiveContext. Но, кажется, нет никакого способа написать прямо из Искры в Улей. Это правда?

Так что мне нужен промежуточный шаг. Я попробовал несколько разных методов хранения данных перед тем, как писать в Hive, и решил записать текстовый файл HDFS, поскольку он, казалось, работал лучше всего для меня. Однако, записывая файл HDFS, я получаю квадратные скобки в файлах, например: [A, B, C]

Итак, когда я загружаю данные в Hive, используя инструкцию «LOAD DATA INPATH ...» HiveQL , Я получаю квадратные скобки в таблице Hive!

Что мне не хватает? Или более правильно, может кто-то пожалуйста, помогите мне понять, какие шаги мне нужно сделать, чтобы:

  • Запуск SQL на SQL Server или Oracle DB
  • записи данных к таблице улей, который может быть доступен инструмент приборной панели.

Мой код прямо сейчас, выглядит примерно так:

DataFrame df= sqlContext.read().format("jdbc").options(getSqlContextOptions(driver, dburl, query)).load(); // This step seem to work fine. 
JavaRDD<Row> rdd = df.javaRDD(); 
rdd.saveAsTextFile(getHdfsUri() + pathToFile); // This works, but writes the rows in square brackets, like: [1, AAA]. 
hiveContext.sql("CREATE TABLE BLAH (MY_ID INT, MY_DESC STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' STORED AS TEXTFILE"); 
hiveContext.sql("LOAD DATA INPATH '" + getHdfsUri() + hdfsFile + "' OVERWRITE INTO TABLE `BLAH`"); // Get's written like: 

MY_INT MY_DESC 
------ ------- 
     AAA] 

Столбец INT не записывается в вообще, потому что ведущий [делает его больше не числовое значение, а последний столбец не показывает "]" в конце строки в файле HDFS.

Пожалуйста, помогите мне понять, почему это не работает или каким будет лучший способ. Благодаря!

Я не заблокирован каким-либо конкретным подходом, поэтому все варианты будут оценены.

ответ

0

Я думаю, что «Вставить» еще не поддерживается.

http://spark.apache.org/docs/latest/sql-programming-guide.html#compatibility-with-apache-hive

Чтобы избавиться от скобок в текстовом файле, вы должны избегать saveAsTextFile. Вместо этого попробуйте написать содержимое с помощью HDFS API. I FSeataInputStream

+0

Благодарим за отзыв, но поскольку я все еще изучаю это, я не понимаю, как перейти от моего DataFrame или RDD к классам API HDFS. Любые мысли по этому поводу? –

1

Хорошо, я понял, что я делаю неправильно. Мне нужно было использовать функцию записи в HiveContext и нужно было использовать com.databricks.spark.csv для записи файла последовательности в Hive. Это не требует промежуточного этапа сохранения файла в HDFS, что отлично, и успешно записывает в Hive.

DataFrame df = hiveContext.createDataFrame(rdd, struct); 
df.select(cols).write().format("com.databricks.spark.csv").mode(SaveMode.Append).saveAsTable("TABLENAME"); 

я должен создать объект StructType, однако, передать в метод createDataFrame для правильного отображения типов данных (что-то вроде показан в середине этой страницы: Support for User Defined Types for java in Spark). И переменная cols представляет собой массив объектов Column, который на самом деле представляет собой просто массив имен столбцов (т.что-то вроде Column [] cols = {новый столбец («COL1»), новый столбец («COL2»)};

Смежные вопросы