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的主要内容,如果未能解决你的问题,请参考以下文章

.NET Regex 是不是支持全局匹配?

Oracle:是不是有支持内联代码的 REGEX_REPLACE 变体?

如何使用 RegEx 检查表单输入是不是以 .pdf 结尾

cdh6.x 集成spark-sql

cdh6.x 集成spark-sql

cdh6.x 集成spark-sql