Spark-SQL 是不是支持使用 regex 规范的 Hive Select All Query with except Columns
Posted
技术标签:
【中文标题】Spark-SQL 是不是支持使用 regex 规范的 Hive Select All Query with except Columns【英文标题】:Does Spark-SQL supports Hive Select All Query with Except Columns using regex specificationSpark-SQL 是否支持使用 regex 规范的 Hive Select All Query with except Columns 【发布时间】:2018-09-26 22:19:02 【问题描述】:我正在尝试使用 pyspark 包装器使用 SPARK-SQL 实现 this functionality。我遇到了这个错误
pyspark.sql.utils.AnalysisException: u"cannot resolve '```(qtr)?+.+```'
given input columns:
这是我的查询..基本上试图排除列'qtr'。
select `(qtr)?+.+` from project.table;
使用以下属性在蜂巢/直线中完美运行
set hive.support.quoted.identifiers=none;
感谢您的帮助?
【问题讨论】:
不完全符合您的要求,但如果您将表格读入数据框 (df = spark.sql("select * from project.table")
),您可以使用列表理解:df = df.select(*[c for c in df.columns if c != "qtr"])
^^ 建议的列表理解比正则表达式更易读
【参考方案1】:
Spark 允许将 RegEx 作为SELECT
表达式中的列名。默认情况下,此行为被禁用。要启用它,我们需要在使用 RegEx 列运行查询之前将以下属性设置为 true
。
spark.sql("SET spark.sql.parser.quotedRegexColumnNames=true").show(false)
设置此属性后,我们可以使用正则表达式选择表达式,如下所示。
spark.sql("SELECT `(.*time.*)+.+` FROM test.orders limit 2""").show(false)
注意:这里它允许任何 java 有效的 RegEx。我已经在 Spark 2.3 中测试过这个解决方案
【讨论】:
这里我编写了正则表达式来获取所有包含time
字符串的列。以上是关于Spark-SQL 是不是支持使用 regex 规范的 Hive Select All Query with except Columns的主要内容,如果未能解决你的问题,请参考以下文章