таблица кустов, созданная из файла паркета, не показывающая никаких данных, даже если данные есть в файле паркета - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть местоположение файла паркета с данными. используя HUE, я создал таблицу улья, как показано ниже

create external table parq_test ( 
  A int,
  B int,
  C int
  )
STORED AS PARQUET
LOCATION '/data/parq_test';

, когда я говорю

select * from parq_test; 

Возвращается 0 строк.

Я пробовал это

MSCK REPAIR TABLE parq_test;

все еще не повезло

ниже я пытался, но он не поддерживается в моей консоли HUE

ALTER TABLE parq_test RECOVER PARTITIONS;

Infact я тестирую в моем ноутбуке, есть данные, доступные в мой паркет Так что здесь не так, почему моя таблица не показывает никаких данных?

1 Ответ

1 голос
/ 25 апреля 2020

Имена столбцов в файле паркета и таблице кустов должны совпадать, тогда только вы можете видеть данные, используя запрос Hive для указанных столбцов c. Если нет, вы увидите строки со значениями NULL для этих столбцов.

Позвольте мне показать вам, как это записано в пошаговой инструкции:

1) Создать таблицу Hive со столбцами (id, name)

0: jdbc:hive2://localhost:10000> CREATE EXTERNAL TABLE kmdb.test_ext_parquet (id STRING, name STRING) STORED AS PARQUET LOCATION '/km_hadoop/data/test_ext_parquet';
No rows affected (0.178 seconds)
0: jdbc:hive2://localhost:10000> SELECT * FROM kmdb.test_ext_parquet;
+----------------------+------------------------+--+
| test_ext_parquet.id  | test_ext_parquet.name  |
+----------------------+------------------------+--+
+----------------------+------------------------+--+
No rows selected (0.132 seconds)

2) Написать файл Parquet: я создаю фрейм данных spark с теми же именами столбцов (id, name) и записываю файл parque.

>>> dataDF=spark.createDataFrame([("1", "aaa"), ("2", "bbb")]) \
...  .toDF("id", "name")
>>> 
>>> dataDF.show(200, False)
+---+----+                                                                      
|id |name|
+---+----+
|1  |aaa |
|2  |bbb |
+---+----+

>>> dataDF.coalesce(1).write.mode('append').parquet("/km_hadoop/data/test_ext_parquet")
>>>

3) Проверьте данные

0: jdbc:hive2://localhost:10000> SELECT * FROM kmdb.test_ext_parquet;
+----------------------+------------------------+--+
| test_ext_parquet.id  | test_ext_parquet.name  |
+----------------------+------------------------+--+
| 1                    | aaa                    |
| 2                    | bbb                    |
+----------------------+------------------------+--+
2 rows selected (0.219 seconds)
0: jdbc:hive2://localhost:10000>

4) Теперь напишите файл паркета с разными именами столбцов (id2, name2), используя Spark dataframe

>>> dataDF2=spark.createDataFrame([("101", "ggg"), ("102", "hhh")]) \
...  .toDF("id2", "name2")
>>> 
>>> dataDF2.show(200, False)
+---+-----+
|id2|name2|
+---+-----+
|101|ggg  |
|102|hhh  |
+---+-----+

>>> 
>>> dataDF2.coalesce(1).write.mode('append').parquet("/km_hadoop/data/test_ext_parquet")
>>>

5) Давайте запросим таблицу, чтобы увидеть данные см. значения NULL для столбцов.

0: jdbc:hive2://localhost:10000> SELECT * FROM kmdb.test_ext_parquet;
+----------------------+------------------------+--+
| test_ext_parquet.id  | test_ext_parquet.name  |
+----------------------+------------------------+--+
| 1                    | aaa                    |
| NULL                 | NULL                   |
| 2                    | bbb                    |
| NULL                 | NULL                   |
+----------------------+------------------------+--+
4 rows selected (0.256 seconds)
0: jdbc:hive2://localhost:10000>

6) Теперь я напишу файл паркета только с одним правильным именем столбца (id), другое не существует (name2).

>>> dataDF3=spark.createDataFrame([("201", "xxx"), ("202", "yyy")]) \
...  .toDF("id", "name2")
>>> 
>>> dataDF3.show(200, False)
+---+-----+
|id |name2|
+---+-----+
|201|xxx  |
|202|yyy  |
+---+-----+

>>> 
>>> dataDF3.coalesce(1).write.mode('append').parquet("/km_hadoop/data/test_ext_parquet")
>>>

7) Давайте запросим таблицу, чтобы увидеть данные, посмотрим значения NULL для неправильных столбцов.

0: jdbc:hive2://localhost:10000> SELECT * FROM kmdb.test_ext_parquet;
+----------------------+------------------------+--+
| test_ext_parquet.id  | test_ext_parquet.name  |
+----------------------+------------------------+--+
| NULL                 | NULL                   |
| NULL                 | NULL                   |
| 1                    | aaa                    |
| 2                    | bbb                    |
| 201                  | NULL                   |
| 202                  | NULL                   |
+----------------------+------------------------+--+
6 rows selected (0.225 seconds)
0: jdbc:hive2://localhost:10000>

8) Теперь, как мы читаем «скрытые» данные? Просто создайте таблицу со всеми столбцами.

0: jdbc:hive2://localhost:10000> CREATE EXTERNAL TABLE kmdb.test_ext_parquet_all_columns (id STRING, name STRING,id2 STRING, name2 STRING)
. . . . . . . . . . . . . . . .>  STORED AS PARQUET LOCATION '/km_hadoop/data/test_ext_parquet';
No rows affected (0.097 seconds)
0: jdbc:hive2://localhost:10000> SELECT * FROM  kmdb.test_ext_parquet_all_columns;
+----------------------------------+------------------------------------+-----------------------------------+-------------------------------------+--+
| test_ext_parquet_all_columns.id  | test_ext_parquet_all_columns.name  | test_ext_parquet_all_columns.id2  | test_ext_parquet_all_columns.name2  |
+----------------------------------+------------------------------------+-----------------------------------+-------------------------------------+--+
| NULL                             | NULL                               | 101                               | ggg                                 |
| NULL                             | NULL                               | 102                               | hhh                                 |
| 1                                | aaa                                | NULL                              | NULL                                |
| 2                                | bbb                                | NULL                              | NULL                                |
| 201                              | NULL                               | NULL                              | xxx                                 |
| 202                              | NULL                               | NULL                              | yyy                                 |
+----------------------------------+------------------------------------+-----------------------------------+-------------------------------------+--+
6 rows selected (0.176 seconds)
0: jdbc:hive2://localhost:10000>

Теперь, как мне узнать, какие все столбцы есть в файле (файлах) паркета ??? Я могу сделать, прочитав файл (ы) паркета с помощью Spark:

>>> spark.read.option("mergeSchema", "true").parquet("/km_hadoop/data/test_ext_parquet").show(10,False)
+----+-----+----+----+
|id2 |name2|id  |name|
+----+-----+----+----+
|101 |ggg  |null|null|
|102 |hhh  |null|null|
|null|xxx  |201 |null|
|null|yyy  |202 |null|
|null|null |1   |aaa |
|null|null |2   |bbb |
+----+-----+----+----+

>>> 

Я надеюсь, что это помогло ..

...