【问题标题】:hive table created from parquet file not showing any data, even though data is there in parquet file从 parquet 文件创建的 hive 表不显示任何数据,即使 parquet 文件中有数据
【发布时间】:2020-07-14 07:45:40
【问题描述】:

我有一个包含数据的镶木地板文件位置。 使用 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;

事实上,我在我的笔记本中测试,我的 parquet 中有可用的数据 文件。那么这里出了什么问题,为什么我的表格没有显示任何数据?

【问题讨论】:

  • 是hadoop还是本地文件系统的位置?
  • MSCK 修复表 parq_test?
  • 能否分享拼花文件的完整路径?这条路径 /data/parq_test 之后是什么?
  • 你的表没有分区,MSCK REPAIR不会有任何影响。假设您在表中定义的列与镶木地板文件的架构相同,请尝试在 LOCATION 中使用完整路径 hdfs:///data/parq_test/
  • @BdEngineer,没错。只有当您的表包含 PARTITIONED BY 部分并且存在 Hive 样式文件夹名称(例如 year=2020/month=02/day=14,而不是 2020/02/14)时,它才会起作用

标签: dataframe apache-spark hive parquet hue


【解决方案1】:

parquet 文件和 hive 表中的列名应该匹配,然后只有您可以使用您的 Hive 查询来查看特定列的数据。如果没有,您将看到这些列的值为 NULL 的行。

让我一步一步地告诉你它是如何写的:

1)创建一个包含列(id、name)的 Hive 表

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 文件:我创建一个具有相同列名 (id,name) 的 spark 数据框并编写一个 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)现在使用 Spark 数据框编写具有不同列名 (id2,name2) 的 parquet 文件

>>> 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) 编写 parquet 文件,另一个不存在 (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>

现在,我如何知道 parquet 文件中的所有列?我可以通过使用 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 |
+----+-----+----+----+

>>> 

我希望这会有所帮助..

【讨论】:

    猜你喜欢
    • 2018-02-19
    • 2018-05-28
    • 2016-03-16
    • 2019-12-06
    • 2019-02-18
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    相关资源
    最近更新 更多