从 Hive 查询时未显示分区表中的数据

Ada*_*old 1 hive apache-spark apache-spark-sql databricks

请注意,这个问题是不是一个重复这一个!我不使用 Spark SQL 进行分区!我正在保存单个镶木地板文件!

我也在使用不支持 Hive-flavored SQL 的Databricks

我在 Hive 中有一个表(我使用的是 Databricks),它包含两个分区。它看起来像这样:

CREATE TABLE foo_test (`col0` STRING, `col1` STRING, `col2` STRING, `datestamp` STRING)
USING parquet
OPTIONS (
  `serialization.format` '1'
)
PARTITIONED BY (datestamp)
Run Code Online (Sandbox Code Playgroud)

编辑: *这也是调用的结果show create table foo_test;

我手动添加了两个带有 Spark 的分区到这个表中:

df = spark.read.csv(file_path.format(datestamp), header=True, inferSchema=True)

partitionPath = "/mnt/foo_test/datestamp={}/".format(datestamp)

df.coalesce(1).write.parquet(partitionPath, mode="overwrite")


/mnt/foo_test/datestamp=20180101/
/mnt/foo_test/datestamp=20180102/
Run Code Online (Sandbox Code Playgroud)

如果我用 Spark 加载数据,我可以看到它在那里:

spark.read.option("mergeSchema", True).parquet("/mnt/foo_test").show()

+----+----+----+----+---------+
|col0|col1|col2|col3|datestamp|
+----+----+----+----+---------+
| foo| bar| baz|   1| 20180102|
| xul| qux| wom|   2| 20180102|
| bar| foo| baz|   1| 20180102|
| qux| xul| wom|   2| 20180102|
| foo| bar| baz|null| 20180101|
| xul| qux| wom|null| 20180101|
| bar| foo| baz|null| 20180101|
| qux| xul| wom|null| 20180101|
+----+----+----+----+---------+
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我对这个 Hive 表运行 SQL 查询,它什么都不返回:

SELECT * FROM foo_test;

OK
Run Code Online (Sandbox Code Playgroud)

即使在手动添加分区之后:

spark.sql("ALTER TABLE foo_test ADD IF NOT EXISTS PARTITION (datestamp=20180102)")
Run Code Online (Sandbox Code Playgroud)

并修理桌子:

MSCK REPAIR TABLE foo_test;
Run Code Online (Sandbox Code Playgroud)

根据 Hive,我可以看到分区存在:

MSCK REPAIR TABLE foo_test;
Run Code Online (Sandbox Code Playgroud)

SELECT没有回报。

这是我的表的描述:

col0    string  null
col1    string  null
col2    string  null
datestamp   string  null
# Partition Information     
# col_name  data_type   comment
datestamp   string  null
# Detailed Table Information        
Database    default 
Table   foo_test    
Owner   root    
Created Thu Apr 26 12:25:06 UTC 2018    
Last Access Thu Jan 01 00:00:00 UTC 1970    
Type    MANAGED 
Provider    parquet 
Table Properties    [transient_lastDdlTime=1524745506]  
Location    dbfs:/user/hive/warehouse/foo_test  
Serde Library   org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe 
InputFormat org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat   
OutputFormat    org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat  
Storage Properties  [serialization.format=1]    
Partition Provider  Catalog
Run Code Online (Sandbox Code Playgroud)

这里可能有什么问题?

小智 6

您没有在CREATE TABLE定义中设置位置,也没有设置新添加分区的位置。

在您的表定义中,您应该将其定义为一个外部表,并为它提供数据的路径,作为LOCATIONPATH参数。然后MSCK REPAIR TABLE应该正确添加分区。

对于ALTER TABLE命令,您需要设置LOCATION参数。在该片段中,您只是告诉表“有一个分区 date=20180102”,而没有告诉它数据在哪里。

每个https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AddPartitions

spark.sql("ALTER TABLE foo_test ADD IF NOT EXISTS PARTITION (datestamp=20180102) location '/mnt/foo_test/datestamp=20180102/' ")