Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 从配置单元查询时,分区表中的数据不会显示_Apache Spark_Hive_Apache Spark Sql_Databricks - Fatal编程技术网

Apache spark 从配置单元查询时,分区表中的数据不会显示

Apache spark 从配置单元查询时,分区表中的数据不会显示,apache-spark,hive,apache-spark-sql,databricks,Apache Spark,Hive,Apache Spark Sql,Databricks,注意这个问题不是的重复!我不使用Spark SQL进行分区!我正在保存单个拼花文件 我还使用了Databricks,它不支持蜂巢风格的SQL 我在Hive中有一个表(我使用的是Databricks),它包含两个分区。看起来是这样的: CREATE TABLE foo_test(`col0`STRING、`col1`STRING、`col2`STRING、`datestamp`STRING) 使用拼花地板 选择权( `序列化。格式为“1” ) 分区人(邮戳) 编辑:*这也是调用show crea

注意这个问题不是的重复!我不使用Spark SQL进行分区!我正在保存单个拼花文件

我还使用了Databricks,它不支持蜂巢风格的SQL

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

CREATE TABLE foo_test(`col0`STRING、`col1`STRING、`col2`STRING、`datestamp`STRING)
使用拼花地板
选择权(
`序列化。格式为“1”
)
分区人(邮戳)
编辑:*这也是调用
show create table foo\u test的结果

我已手动将两个带有Spark的分区添加到此表中:

df=spark.read.csv(文件路径格式(日期戳),头=True,推断模式=True)
partitionPath=“/mnt/foo_test/datestamp={}/”。格式(日期戳)
df.coalesce(1.write.parquet)(partitionPath,mode=“overwrite”)
/mnt/foo_测试/日期戳=20180101/
/mnt/foo_测试/日期戳=20180102/
如果我用Spark加载数据,我可以看到它在那里:

spark.read.option(“mergeSchema”,True).parquet(“/mnt/foo_test”).show()
+----+----+----+----+---------+
|col0 | col1 | col2 | col3 |邮戳|
+----+----+----+----+---------+
|福巴尔巴兹1号20180102|
|xul | qux | wom | 2 | 20180102|
|巴|福|巴| 1 | 20180102|
|qux | xul | wom | 2 | 20180102|
|富|巴|巴|零| 20180101|
|xul | qux | wom | null | 20180101|
|巴|福|巴|零| 20180101|
|qux | xul | wom | null | 20180101|
+----+----+----+----+---------+
我的问题是,如果对此配置单元表运行SQL查询,它将不会返回任何结果:

从foo_测试中选择*;
好啊
即使手动添加分区后:

spark.sql(“ALTER TABLE foo_test ADD IF NOT EXISTS PARTITION(datestamp=20180102)”)
和修理桌子:

MSCK REPAIR TABLE foo_test;
我可以看到分区是根据配置单元显示的:

显示分区foo_测试;
隔断
邮戳=20180102
邮戳=20180101
但是
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
这里可能有什么问题?

我不使用Spark SQL进行分区

我不同意。这不是配置单元表定义:

CREATE TABLE foo_test (`col0` STRING, `col1` STRING, `col2` STRING, `datestamp` STRING)
USING parquet
OPTIONS (
  `serialization.format` '1'
)
PARTITIONED BY (datestamp)
这是一个Spark表定义

:

因此,您确实使用了Spark分区,如中所述,Spark和Hive分区方案不兼容

请注意,
SparkSession.sql
在初始化
SparkSession
时,只要启用了配置单元支持,就支持配置单元和Spark(Databricks平台上的默认设置)

此外,还不清楚为什么要在这里编写
/mnt/foo_test/datestamp={}
,这可能是另一个问题的根源。如果您想使用本地文件API(为什么要?),Databricks会在默认情况下将其装载在
/dbfs

由于调用
addpartitions
时没有位置,因此它使用表的根路径(
dbfs:/user/hive/warehouse/foo_test
,基于
description
输出),因此如果您决定使用本地API,并使用默认配置,则应该写入

/dbfs/user/hive/warehouse/foo_test/datestamp=20180102
如果您使用非标准配置,最好将其包含在您的问题中

我不使用Spark SQL进行分区

我不同意。这不是配置单元表定义:

CREATE TABLE foo_test (`col0` STRING, `col1` STRING, `col2` STRING, `datestamp` STRING)
USING parquet
OPTIONS (
  `serialization.format` '1'
)
PARTITIONED BY (datestamp)
这是一个Spark表定义

:

因此,您确实使用了Spark分区,如中所述,Spark和Hive分区方案不兼容

请注意,
SparkSession.sql
在初始化
SparkSession
时,只要启用了配置单元支持,就支持配置单元和Spark(Databricks平台上的默认设置)

此外,还不清楚为什么要在这里编写
/mnt/foo_test/datestamp={}
,这可能是另一个问题的根源。如果您想使用本地文件API(为什么要?),Databricks会在默认情况下将其装载在
/dbfs

由于调用
addpartitions
时没有位置,因此它使用表的根路径(
dbfs:/user/hive/warehouse/foo_test
,基于
description
输出),因此如果您决定使用本地API,并使用默认配置,则应该写入

/dbfs/user/hive/warehouse/foo_test/datestamp=20180102

如果您使用非标准配置,最好将其包含在问题中。

表格定义指向不同的位置

Location    dbfs:/user/hive/warehouse/foo_test  
它应该指向以下位置
/mnt/foo_test


查找具有位置的配置单元创建表

表定义指向不同的位置

Location    dbfs:/user/hive/warehouse/foo_test  
它应该指向以下位置
/mnt/foo_test


在配置单元中创建表时,请使用位置查找配置单元创建表

CREATE TABLE foo_test (`col0` STRING, `col1` STRING, `col2` STRING)
PARTITIONED BY (`datestamp` STRING)
stored as PARQUET
location '/mnt/foo_test';
您可以使用带分区的spark write:

df.repartition($"datestamp").partitionBy("datestamp").write.parquet(partitionPath, mode="overwrite")
这将使用分区路径/mnt/foo\u test/datestamp=***/写入配置单元表


我希望这将有助于在hive use中创建表:

CREATE TABLE foo_test (`col0` STRING, `col1` STRING, `col2` STRING)
PARTITIONED BY (`datestamp` STRING)
stored as PARQUET
location '/mnt/foo_test';
您可以使用带分区的spark write:

df.repartition($"datestamp").partitionBy("datestamp").write.parquet(partitionPath, mode="overwrite")
这将使用分区路径/mnt/foo\u test/datestamp=***/写入配置单元表


我希望这会有所帮助

您没有在
创建表定义中设置位置,也没有设置新添加分区的位置

在表定义中,应将其定义为外部表,并将数据路径指定为
位置
路径
参数。然后
MSCK REPAIR TABLE
应该正确地添加分区

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

spa