我使用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中的分区表吗?
要读取分区表(由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()
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。