У нашей команды есть набор Hive QL, поэтому при переходе на spark мы хотим повторно использовать существующий HQL, который использует Hive Спецификация столбца Regex как SELECT `(ds)?+.+` FROM
.
Это можно сделать, просто включив следующую конфигурацию:
spark.conf.set('spark.sql.parser.quotedRegexColumnNames', 'true')
Однако, если указанная выше конфигурация включена, запрос любого представления Hive с использованием Spark SQL не удался, и Spark SQL Analyzer будет выдавать жалобу
pyspark.sql.utils.AnalysisException: u"Invalid usage of '*' in expression 'unresolvedextractvalue';"
Простой сценарий pyspark для воспроизведения проблемы выглядит следующим образом:
from pyspark.sql import SparkSession
def main():
spark = SparkSession.builder.appName('test_spark').enableHiveSupport().getOrCreate()
spark.conf.set('hive.exec.dynamic.partition.mode', 'nonstrict')
spark.conf.set('spark.sql.sources.partitionOverwriteMode','dynamic')
spark.conf.set('spark.sql.parser.quotedRegexColumnNames', 'true')
spark_sql = r'''
SELECT
id_listing
FROM
<A Hive View>
WHERE
ds = '2019-03-09'
'''
result = spark.sql(spark_sql)
print(result.count())
if __name__ == '__main__':
main()
Мне было интересно, можно ли сосуществовать в Spark со спецификацией Regex Column и Hive View.
Я наблюдал это поведение в Spark 2.3.0 и 2.4.0