当前位置: 首页 > 知识库问答 >
问题:

配置单元分区表读取所有分区,尽管有Spark过滤器

慎风畔
2023-03-14

Scala>spark.sql(“从db.table中选择*,其中year=2019 and month=2 and day=28 and a='y'and b='z'”)。show

但是我得到了这个错误:

sparkException:由于阶段失败而中止作业:阶段0.0中的任务236失败4次,最近的失败:阶段0.0中丢失任务236.3(TID 287,server,executor 17):org.apache.hadoop.security.AccessControlException:权限被拒绝:user=user,access=read,inode=“/path-to-table/table/year=2019/month=2/day=27/a=W/b=x/part-00002”:user:group:-rw-rw---

正如您所看到的,spark正在尝试读取一个不同的分区,而我在那里没有权限。

它不应该是,因为我创建了一个过滤器,这个过滤器是我的分区。

我用Hive尝试了同样的查询,它工作得很好(没有访问问题)

有些文件是用配置单元创建的,有些文件是从一个服务器复制并以不同的权限粘贴到我们的服务器上(我们不能更改权限),那么他们应该已经刷新了数据。

我们使用的是:Cloudera 5.13.2.1Hive 1.1.0Spark 2.3.0Hadoop 2.6.0Scala 2.11.8Java 1.8.0_144

显示创建表

|CREATE EXTERNAL TABLE Columns and type
PARTITIONED BY (`year` int COMMENT '*', `month` int COMMENT '*', `day` int COMMENT '*', `a` string COMMENT '*', `b` string COMMENT '*')
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
 'serialization.format' = '1'
)
STORED AS
 INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
 OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 'hdfs://path'
TBLPROPERTIES (
 'transient_lastDdlTime' = '1559029332'
)
|

共有1个答案

卞俊哲
2023-03-14

Spark中的拼花配置单元表可以使用以下2个读取流-

>

  • hive flow-当spark.sql.hive.convertmastoreParquet设置为false时,将使用此设置。为了使分区pruining在本例中工作,您必须设置spark.sql.hive.metastreepartitionpruning=true

    metastreepartitionPruning:当为true时,一些谓词将被下推到Hive metastore中,这样就可以更早地消除不匹配的分区。这只影响未转换为文件源关系的配置单元表(有关更多信息,请参见hiveutils.convert_metastore_parquet和hiveutils.convert_metastore_orc

  •  类似资料:
    • 我正在使用Spark2.0,我想知道,是否可以列出特定配置单元表的所有文件?如果是这样,我可以直接使用spark增量地更新这些文件。如何向配置单元表添加新分区?有没有关于蜂巢转移瘤的api我可以从Spark使用? 有什么方法可以获得映射dataframe的内部配置单元函数吗 我的主要理由是对表进行增量更新。现在,我知道的唯一方法是SQL+,这不是很有效,因为他将覆盖所有表,而我主要感兴趣的是对某些

    • 我有一个外部分区配置单元表,下面的文件行格式分隔字段以“通过配置单元直接读取数据就可以了,但是当使用Spark的Dataframe API时,分隔符”没有被考虑在内。 创建外部分区表: dataframe.show()输出:

    • 这是将Spark dataframe保存为Hive中的动态分区表的后续操作。我试图在答案中使用建议,但无法在Spark 1.6.1中使用 任何推动这一进程的帮助都是感激的。 编辑:还创建了SPARK-14927

    • 我正在与AWS工作,我有使用Spark和Hive的工作流。我的数据是按日期分区的,所以每天我的S3存储中都有一个新分区。我的问题是,当有一天加载数据失败时,我不得不重新执行那个分区。接下来编写的代码是: 在我的流动中发生了什么?如果我使用savemode.overwrite,完整的表将被删除,并且只保存分区。如果我使用savemode.append,我可能会有重复的数据。 我想要的是:在表中,分区

    • 我有一个复杂的/嵌套的配置单元外部表,它是在HDFS顶部创建的(文件是avro格式的)。当我运行配置单元查询时,它会显示所有记录和分区。 然而,当我在Spark中使用相同的表时: 请注意,当我查看数据时,分区列不是底层保存数据的一部分,但当我通过hive查询表时,我可以看到它。当我尝试使用PySpark加载avro文件时,我也可以看到分区列: 所以我想知道那是什么样子?

    • 我有一个简单的配置单元-外部表,它是在S3的顶部创建的(文件是CSV格式的)。当我运行配置单元查询时,它会显示所有记录和分区。 但是,当我在Spark中使用相同的表时(Spark SQL在分区列上有where条件),它并没有显示应用了分区筛选器。然而,对于配置单元托管表,Spark能够使用分区信息并应用分区筛选器。 是否有任何标志或设置可以帮助我利用Spark中Hive外部表的分区?谢了。