如何在pyspark的orc格式的配置单元表上执行查询时避免assertionerror?

qnzebej0  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(372)

我正在从pyspark运行一个简单的配置单元查询,但它抛出了一个错误。该表为orc格式。需要一些帮助。下面是代码

spark = SparkSession.builder.appName("Termination_Calls Snapshot").config("hive.exec.dynamic.partition", "true").config("hive.exec.dynamic.partition.mode", "nonstrict").enableHiveSupport().getOrCreate()
x_df = spark.sql("SELECT count(*) as RC from bi_schema.table_a")

这抛出如下错误

Hive Session ID = a00fe842-7099-4130-ada2-ee4ae75764be 
Traceback (mostrecent call last):   
File "<stdin>", line 1, in <module>   
File "/usr/hdp/current/spark2-client/python/pyspark/sql/session.py", line 716, in sql
return DataFrame(self._jsparkSession.sql(sqlQuery), self._wrapped)   
File "/usr/hdp/current/spark2-client/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py",line 1257, in __call__   
File "/usr/hdp/current/spark2-client/python/pyspark/sql/utils.py", line 63,
in deco return f(*a,**kw)   
File "/usr/hdp/current/spark2-client/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value py4j.protocol.Py4JJavaError: An error occurred while calling o70.sql. : java.lang.AssertionError: assertion
failed at scala.Predef$.assert(Predef.scala:156) at org.apache.spark.sql.hive.HiveMetastoreCatalog.convertToLogicalRelation(HiveMetastoreCatalog.scala:214)

当我在配置单元中运行相同的查询时,我得到了预期的结果,结果如下所示。

+-------------+
|     rc      |
+-------------+
| 3037579538  |
+-------------+
1 row selected (25.469 seconds)
vsaztqbk

vsaztqbk1#

这是spark中的bug,特定于orc格式。
在sparkcontext配置中设置以下属性将解决问题: spark.conf.set("spark.sql.hive.convertMetastoreOrc", "false") 如果我们仔细研究一下hivemetastorecatalog的spark代码 assert(result.output.length == relation.output.length && result.output.zip(relation.output).forall { case (a1, a2) => a1.dataType == a2.dataType }) 正在失败。这意味着它正在检查列数和数据类型。一个原因可能是alter表之后metastore没有更新,但这是不太可能的。
后来我想为同一张票创建jira票,但结果发现orc格式总是有一些问题。关于这个问题,已经有两张jira罚单:
Spark-28098
Spark-28099
如果我们继续 spark.sql.hive.convertMetastoreOrc 默认 true 然后它将使用矢量化的阅读器官方文档。由于这个错误,列数不匹配,Assert失败。我怀疑这个属性会导致在使用矢量读取器时添加一些伪列。

n9vozmp4

n9vozmp42#

您能试一下下面的步骤吗?因为我认为我们不能直接使用hivecontext查询配置单元表

from pyspark.sql import HiveContext
hive_context = HiveContext(sc)
result= hive_context.table("bi_schema.table_a")

在以上述方式获取表之后,我们需要像下面这样注册结果Dataframe

result.registerTempTable("table_a")

现在我们可以在该表上查询select语句,如下所示

x_df = hive_context.sql("SELECT count(*) as RC fromtable_a")

相关问题