Имена столбцов в файле паркета и таблице кустов должны совпадать, тогда только вы можете видеть данные, используя запрос 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 |
+----+-----+----+----+
>>>
Я надеюсь, что это помогло ..