Dataframe 从拼花文件创建的配置单元表不显示任何数据,即使拼花文件中有数据
我有一个拼花文件的位置,其中有数据。 使用色调,我创建了一个蜂巢表,如下所示Dataframe 从拼花文件创建的配置单元表不显示任何数据,即使拼花文件中有数据,dataframe,apache-spark,hive,parquet,hue,Dataframe,Apache Spark,Hive,Parquet,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; 还是不走运 下面我尝试了,但在我的控制台中不支持
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;
还是不走运
下面我尝试了,但在我的控制台中不支持
ALTER TABLE parq_test RECOVER PARTITIONS;
事实上,我在笔记本上测试,我的拼花地板上有可用的数据
文件那么这里出了什么问题,为什么我的表没有显示任何数据
拼花文件和配置单元表中的列名应该匹配,然后只有您可以使用配置单元查询查看特定列的数据。如果不是,您将看到这些列的行具有空值
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>
让我向您展示它是如何在分步说明中编写的:
1) 创建包含列(id、名称)的配置单元表
2) 编写拼花文件:我创建一个具有相同列名(id,name)的spark数据框并编写一个拼花文件
>>> 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 dataframe编写具有不同列名(id2,name2)的拼花文件
>>> 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) 让我们查询表以查看数据,查看列的空值
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)
7) 让我们查询表以查看数据,查看不正确列的空值
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 |
+----+-----+----+----+
>>>
我希望这有帮助。是hadoop还是本地文件系统的位置?MSCK修复表拼花测试?您能分享拼花文件的完整路径吗?这个路径/数据/parq_测试之后是什么?您的表没有分区,MSCK修复不会有任何影响。假设表中定义的列与拼花地板文件的模式相同,请尝试使用完整路径hdfs:///data/parq_test/ 在里面LOCATION@BdEngineer确切地只有当您的表包含按部分分区的文件夹,并且存在配置单元样式的文件夹名称,如year=2020/month=02/day=14,而不是2020/02/14时,它才会起作用
>>> 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 |
+----+-----+----+----+
>>>