我使用胶水作为我的Hive元商店。我有一个每小时工作,每小时将文件写入已注册的分区。
表定义:
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
它将在sparksql中工作。但是通过这种方式,数据可以通过hive而不是sparksql进行查询。
我也尝试过将这些conf添加到我的spark shell中,但没有成功。
"spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive=true"
"spark.hadoop.hive.mapred.supports.subdirectories=true"
2条答案
按热度按时间fkaflof61#
我认为您所做的是在hive-site.xml中启用了粘合目录,而不是在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.htmlt5fffqht2#
通过创建一个类似于您的表来测试场景,下面的配置对我很有用:
第一套:
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-metastoreParquet表转换