Spark Hive SQL 正在返回空数据帧
Spark Hive SQL is Returning Empty Dataframe
我正在使用 Glue 作为我的配置单元元存储。我有一份按小时计算的工作,每小时将文件写入已注册的分区。
Table定义:
CREATE EXTERNAL TABLE table_name (
column_1 STRING,
column_2 STRING
)
PARTITIONED BY (process_date DATE)
STORED AS PARQUET
LOCATION "s3://bucket/table_name/";
spark.sql("ALTER TABLE table_name ADD IF NOT EXISTS partition(process_date='2019-11-13')
LOCATION 's3://bucket/table_name/process_date=2019-11-13'")
该分区和部分文件的 s3 位置是
s3://bucket/table_name/process_date=2019-11-13/hour=00/part-01.parquet
s3://bucket/table_name/process_date=2019-11-13/hour=00/part-02.parquet
s3://bucket/table_name/process_date=2019-11-13/hour=01/part-01.parquet
s3://bucket/table_name/process_date=2019-11-13/hour=01/part-02.parquet
我知道如果我将 hour=00
和 hour=01
添加到分区位置,它将在 spark sql 中工作。但是通过这种方式,数据可以通过 Hive 查询,但不能通过 spark sql。
我也试过将这些 confs 添加到我的 spark-shell,但没有成功。
"spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive=true"
"spark.hadoop.hive.mapred.supports.subdirectories=true"
我认为您所做的是在 hive-site.xml 中启用了 Glue 目录,但在 spark-hive-site.xml.
中未启用
您的分类还应包含以下部分:
[
{
"Classification": "spark-hive-site",
"Properties": {
"hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"
}
},
]
参考:[1] https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-glue.html
通过创建一个类似于您的 table 来测试该场景,下面的配置对我有用:
第一组:
sqlContext.setConf("spark.sql.hive.convertMetastoreParquet", "false")
然后这个:
sqlContext.setConf("mapred.input.dir.recursive","true");
sqlContext.setConf("spark.sql.parquet.binaryAsString", "true")
您可以在此处阅读更多内容:[1] https://home.apache.org/~pwendell/spark-nightly/spark-branch-2.2-docs/latest/sql-programming-guide.html#hive-metastore-parquet-table-conversion
我正在使用 Glue 作为我的配置单元元存储。我有一份按小时计算的工作,每小时将文件写入已注册的分区。
Table定义:
CREATE EXTERNAL TABLE table_name (
column_1 STRING,
column_2 STRING
)
PARTITIONED BY (process_date DATE)
STORED AS PARQUET
LOCATION "s3://bucket/table_name/";
spark.sql("ALTER TABLE table_name ADD IF NOT EXISTS partition(process_date='2019-11-13')
LOCATION 's3://bucket/table_name/process_date=2019-11-13'")
该分区和部分文件的 s3 位置是
s3://bucket/table_name/process_date=2019-11-13/hour=00/part-01.parquet
s3://bucket/table_name/process_date=2019-11-13/hour=00/part-02.parquet
s3://bucket/table_name/process_date=2019-11-13/hour=01/part-01.parquet
s3://bucket/table_name/process_date=2019-11-13/hour=01/part-02.parquet
我知道如果我将 hour=00
和 hour=01
添加到分区位置,它将在 spark sql 中工作。但是通过这种方式,数据可以通过 Hive 查询,但不能通过 spark sql。
我也试过将这些 confs 添加到我的 spark-shell,但没有成功。
"spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive=true"
"spark.hadoop.hive.mapred.supports.subdirectories=true"
我认为您所做的是在 hive-site.xml 中启用了 Glue 目录,但在 spark-hive-site.xml.
中未启用您的分类还应包含以下部分:
[
{
"Classification": "spark-hive-site",
"Properties": {
"hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"
}
},
]
参考:[1] https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-glue.html
通过创建一个类似于您的 table 来测试该场景,下面的配置对我有用:
第一组:
sqlContext.setConf("spark.sql.hive.convertMetastoreParquet", "false")
然后这个:
sqlContext.setConf("mapred.input.dir.recursive","true");
sqlContext.setConf("spark.sql.parquet.binaryAsString", "true")
您可以在此处阅读更多内容:[1] https://home.apache.org/~pwendell/spark-nightly/spark-branch-2.2-docs/latest/sql-programming-guide.html#hive-metastore-parquet-table-conversion