开发者社区> 问答> 正文

当数据存储在对象存储中时,从Spark SQL访问Hive表

我使用spark数据帧编写器在IBM Cloud Object Storage中以parquet 格式在内部hive表中编写数据。所以,我的hive Metastore在HDP集群中,我从HDP集群运行spark作业。此spark作业将数据以parquet 格式写入IBM COS。这就是我开始saprk session的方式

SparkSession session = SparkSession.builder().appName("ParquetReadWrite")

                            .config("hive.metastore.uris", "<thrift_url>")
                            .config("spark.sql.sources.bucketing.enabled", true)
                            .enableHiveSupport()
                            .master("yarn").getOrCreate();

session.sparkContext().hadoopConfiguration().set("fs.cos.mpcos.iam.api.key",credentials.get(ConnectionConstants.COS_APIKEY));
session.sparkContext().hadoopConfiguration().set("fs.cos.mpcos.iam.service.id",credentials.get(ConnectionConstants.COS_SERVICE_ID));
session.sparkContext().hadoopConfiguration().set("fs.cos.mpcos.endpoint",credentials.get(ConnectionConstants.COS_ENDPOINT));
我面临的问题是,当我分区数据并存储它(通过partitionBy)时,我无法直接从spark sql访问数据

spark.sql("select * from partitioned_table").show
要从分区表中获取数据,我必须加载数据帧并将其注册为临时表,然后进行查询。表未分区时,不会发生上述问题。写这些数据的代码是这样的

dfWithSchema.orderBy(sortKey).write()

                            .partitionBy("somekey")
                            .mode("append")
                            .format("parquet")
                            .option("path",PARQUET_PATH+tableName )
                            .saveAsTable(tableName);

知道为什么直接查询方法不适用于COS / Parquet中的分区表吗?

展开
收起
社区小助手 2018-12-19 16:37:08 4734 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    要读取分区表(由Spark创建),您需要提供表的绝对路径,如下所示。

    selected_Data=spark.read.format("parquet").option("header","false").load("hdfs/path/loc.db/partition_table")
    要进一步过滤,请尝试以下方法。

    selected_Data.where(col("column_name")=='col_value').show()

    2019-07-17 23:23:01
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Hive Bucketing in Apache Spark 立即下载
spark替代HIVE实现ETL作业 立即下载
2019大数据技术公开课第五季—Hive迁移到MaxCompute最佳实践 立即下载