【问题标题】:Read spark column with semicolon using Spark SQL使用 Spark SQL 读取带分号的 spark 列
【发布时间】:2021-11-23 22:34:06
【问题描述】:

我正在尝试使用 Spark SQL 从包含 ;(分号)的数据框中读取一列。该列的名称是Profit & Gain。虽然在查询架构时列名的显示方式相同,但当我尝试使用 select 子句查询列时无法使用它。

spark.createDataFrame([[1,2],[2,3]], ["id", "Profit & Gain"]).createOrReplaceTempView("dex")

%sql select 
`Profit & Gain` from dex

错误是:

Error in SQL statement: ParseException: 
no viable alternative at input 'select \n`'(line 2, pos 0)

== SQL ==
select 
`Profit &amp
^^^

我知道';'在列名中绝对是一种不好的做法,但我想知道是否有办法克服这个问题。我尝试使用反引号将其括起来,但没有用。

注意:这似乎使用 pyspark 工作得很好,但 spark sql 却失败了。 我注意到的另一件事是,除了 ;(分号)之外的任何字符都可以完美地工作。

【问题讨论】:

  • 能否请您添加代码以重现问题?对我来说,以下代码有效:df=spark.createDataFrame([[1,2],[2,3]], ["id", "Profit & Gain"]) df.select("Profit & Gain").show()
  • @werner 编辑完成!
  • @halfwind22 - 你用的是什么火花版本?
  • @Vaebhav Azure Databricks Runtime 8.3(包括 Apache Spark 3.1.1、Scala 2.12)

标签: apache-spark pyspark apache-spark-sql databricks azure-databricks


【解决方案1】:

使用backticks 转义所需的列工作正常 -

sql.createDataFrame([[1,2],[2,3]], ["id", "Profit & Gain"]).createOrReplaceTempView("dex")

sql.sql("""
    select 
        `Profit & Gain`
    from dex
    """
).show()

+-----------------+
|Profit & Gain|
+-----------------+
|                2|
|                3|
+-----------------+

【讨论】:

  • 即使下面的工作 spark.sql("select Profit & Gain from dex").show() ,但不是 %sql select Profit & Gain from dex
  • 反引号也无济于事。
  • 所以您希望它与 Databricks 中的 %sql 解释器一起使用?
  • 长话短说,是的。也许Databricks SQL的spark.sql和SELECT命令对应的查询解析技术不同
猜你喜欢
  • 2019-11-04
  • 2018-03-25
  • 2018-05-16
  • 2014-12-02
  • 1970-01-01
  • 2018-03-05
  • 2020-02-06
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多