улей внешний стол на паркете не выбирает данные - PullRequest
0 голосов
/ 13 декабря 2018

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

- СОЗДАТЬ ВНЕШНЮЮ ТАБЛИЦУ HIVE создать внешнюю таблицу emp (id double, временная метка hire_dt, строка пользователя), хранящуюся как расположение паркета '/ test / emp';

сейчассоздал фрейм данных на некоторых данных и сохранил в паркет.

--- создайте фрейм данных и вставьте ДАННЫЕ

val employeeDf = Seq(("1", "2018-01-01","John"),("2","2018-12-01", "Adam")).toDF("id","hire_dt","user")
val schema = List(("id", "double"), ("hire_dt", "date"), ("user", "string"))
val newCols= schema.map ( x => col(x._1).cast(x._2)) 
val newDf = employeeDf.select(newCols:_*)
newDf.write.mode("append").parquet("/test/emp")
newDf.show 

--read the contents directly from parquet 
val sqlcontext=new org.apache.spark.sql.SQLContext(sc)
sqlcontext.read.parquet("/test/emp").show 

+---+----------+----+
| id|   hire_dt|user|
+---+----------+----+
|1.0|2018-01-01|John|
|2.0|2018-12-01|Adam|
+---+----------+----+

--read from the external hive table 
spark.sql("select  id,hire_dt,user from  emp").show(false)

+---+-------+----+
|id |hire_dt|user|
+---+-------+----+
+---+-------+----+

Как показано выше, я могу видеть данные, если читаю из паркета напрямую, ноне из улья. Вопрос в том, что я здесь делаю неправильно?Что я делаю неправильно, что улей не получает данные.Я думал, что восстановление msck может быть причиной, но я получаю ошибку, если я пытаюсь сделать таблицу восстановления msck, говоря, что таблица не разбита на разделы.

Ответы [ 4 ]

0 голосов
/ 03 января 2019

Я получил это, работая с ниже chgn.

val dfTransformed = employeeDf.withColumn("id", employeeDf.col("id").cast(DoubleType))
            .withColumn("hire_dt", employeeDf.col("hire_dt".cast(TimestampType))

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

val employeeDf = Seq(("1", "2018-01-01","John"),("2","2018-12-01", "Adam")).toDF("id","hire_dt","user")

val dfTransformed = employeeDf.withColumn("id", employeeDf.col("id").cast(DoubleType))
    .withColumn("hire_dt", employeeDf.col("hire_dt".cast(TimestampType))

dfTransformed.write.mode("append").parquet("/test/emp")
dfTransformed.show 

--read the contents directly from parquet 
val sqlcontext=new org.apache.spark.sql.SQLContext(sc)
sqlcontext.read.parquet("/test/emp").show 

+---+----------+----+
| id|   hire_dt|user|
+---+----------+----+
|1.0|2018-01-01|John|
|2.0|2018-12-01|Adam|
+---+----------+----+

--read from the external hive table 
spark.sql("select  id,hire_dt,user from  emp").show(false)
+---+----------+----+
| id|   hire_dt|user|
+---+----------+----+
|1.0|2018-01-01|John|
|2.0|2018-12-01|Adam|
+---+----------+----+
0 голосов
/ 13 декабря 2018

Помимо ответа, данного Рамдевым ниже, вам также следует быть осторожным при использовании правильного типа данных вокруг даты / метки времени;тип 'date' не поддерживается паркетом при создании таблицы улья.

Для этого вы можете изменить тип 'date' для столбца 'hire_dt' на 'timestamp'.

В противном случае могут возникнуть несоответствия в данных, сохраняемых через искруи пытается читать в улье (или в кусте SQL).Сохранение метки времени в обоих местах решит проблему.Я надеюсь, что это помогает.

0 голосов
/ 14 декабря 2018

Есть ли у вас enableHiveSupport () в вашем выражении sparkSession builder ().Можете ли вы подключиться к улья метасторПопробуйте показать таблицы / базы данных в своем коде, чтобы увидеть, можете ли вы отображать таблицы, представленные в вашем местоположении улья?

0 голосов
/ 13 декабря 2018

Исходя из вашего оператора создания таблицы, вы использовали расположение в качестве / test / emp, но при записи данных вы пишете в / tenants / gwm / idr / emp.Таким образом, у вас не будет данных в /test/emp.

CREATE EXTERNAL HIVE TABLE создать внешнюю таблицу emp (id double, временная метка hire_dt, строка пользователя), хранящуюся как расположение паркета '/ test / emp';

Пожалуйста, заново создайте внешнюю таблицу как

CREATE EXTERNAL HIVE TABLE создайте внешнюю таблицу emp (id double, временная метка hire_dt, строка пользователя), сохраненную как расположение паркета '/ tenants / gwm / idr / emp';

...