【问题标题】:Spark not able to read hive table because of _1 and _2 sub folders in S3由于 S3 中的 _1 和 _2 子文件夹,Spark 无法读取配置单元表
【发布时间】:2018-03-23 12:05:30
【问题描述】:

我有以下 3 个结构相同的配置单元表。

drop table default.test1;
CREATE EXTERNAL TABLE `default.test1`(                                                                                                    
`c1` string,                                                                                                                                                                     
`c2` string,                                                                                                                                                                    
`c3` string)                                                                                                                                                                
ROW FORMAT SERDE                                                                                                                                                                        
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'                                                                                                                         
STORED AS INPUTFORMAT                                                                                                                                                                   
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'                                                                                                                       
OUTPUTFORMAT                                                                                                                                                                            
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'                                                                                                                      
LOCATION                                                                                                                                                                                
's3://s3_bucket/dev/dev/testspark/test1/';

drop table default.test2;
CREATE EXTERNAL TABLE `default.test2`(                                                                                                    
`c1` string,                                                                                                                                                                     
`c2` string,                                                                                                                                                                    
`c3` string)                                                                                                                                                                
ROW FORMAT SERDE                                                                                                                                                                        
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'                                                                                                                         
STORED AS INPUTFORMAT                                                                                                                                                                   
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'                                                                                                                       
OUTPUTFORMAT                                                                                                                                                                            
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'                                                                                                                      
LOCATION                                                                                                                                                                                
's3://s3_bucket/dev/dev/testspark/test2/';


drop table default.test3;
CREATE EXTERNAL TABLE `default.test3`(                                                                                                    
`c1` string,                                                                                                                                                                     
`c2` string,                                                                                                                                                                    
`c3` string)                                                                                                                                                                
ROW FORMAT SERDE                                                                                                                                                                        
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'                                                                                                                         
STORED AS INPUTFORMAT                                                                                                                                                                   
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'                                                                                                                       
OUTPUTFORMAT                                                                                                                                                                            
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'                                                                                                                      
LOCATION                                                                                                                                                                                
's3://s3_bucket/dev/dev/testspark/test3/';
hive>insert into default.test1 values("a","b","c");
hive>insert into default.test2 values("d","e","f");
hive>insert overwrite table default.test3 select * from default.test1 UNION ALL select * from default.test2;

在我使用 test1 和 test2 的 UNION ALL 加载数据后。 test3 表 s3 路径在子文件夹中有数据,如下所示。

PRE 1/                                                                                                                                                             
PRE 2/

当我从 hive 查询 test3 表时,它会给出插入数据的结果。 但是当我在 Spark 中查询相同的内容时。它的计数为零。 pyspark 外壳:

>>>sqlContext.sql("select * from default.test3").count()
>>>0

如何解决这个问题?

【问题讨论】:

  • Spark 版本为 2.0
  • 刚刚想到,如果我可以让 hive 将输出写入单个文件而不是 2 个子目录,我应该能够通过 Spark 读取输出表。
  • 设置 hive.exec.reducers.max=1;我在蜂巢中设置了这个属性。并执行了插入覆盖 stmt。我仍然看到创建的子文件夹。所以问题还没有解决。

标签: apache-spark hive pyspark


【解决方案1】:

除了上述属性之外,还需要设置一个属性才能完成这项工作。

spark.conf.set("mapred.input.dir.recursive","true") 
spark.conf.set("mapreduce.input.fileinputformat.input.dir.recursive","true")
spark.conf.set("spark.sql.hive.convertMetastoreParquet", "false") 

【讨论】:

    【解决方案2】:

    在运行 sqlContext.sql 之前尝试设置以下属性

    sqlContext.setConf("mapred.input.dir.recursive","true"); sqlContext.setConf("mapreduce.input.fileinputformat.input.dir.recursive","true");

    【讨论】:

    • 我们的实验表明spark.conf.set("spark.sql.hive.convertMetastoreParquet", "false") 也是必要的。
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2011-08-02
    • 2013-10-11
    • 1970-01-01
    相关资源
    最近更新 更多