【问题标题】:Hive queries in spark sqlspark sql 中的 Hive 查询
【发布时间】:2020-08-02 12:46:52
【问题描述】:

我可以在 spark.sql 中使用任何类型的 sql 查询,但是在下面的查询中应用 spark.sql 时会出错。 (cstone_feed_key|cstone_last_updatetm|rte_call_key_seq_no)?+.+ sysntax 主要用于从 hive 中的选择中排除字段。请提出一些方法来做同样的事情。我的表中有大约 1000 个字段。

选择 rte_call_key_seq_no 作为 T_rte_call_key_seq_no, (cstone_feed_key|cstone_last_updatetm|rte_call_key_seq_no)?+.+ 从表

【问题讨论】:

  • 您需要替代方案吗?这不受支持,但如果需要,实施替代方案并不困难
  • 请分享另一种方式。
  • 请分享另一种方式。
  • 已添加,请查看

标签: python python-3.x apache-spark apache-spark-sql


【解决方案1】:

update-1

spark.sql("SET spark.sql.parser.quotedRegexColumnNames=true")
    df.createOrReplaceTempView("table")
    spark.sql("select `(account_id|credit_card_limit)?+.+` from table")
      .printSchema()

    /**
      * root
      * |-- credit_card_Number: long (nullable = true)
      * |-- first_name: string (nullable = true)
      * |-- last_name: string (nullable = true)
      * |-- phone_number: integer (nullable = true)
      * |-- amount: integer (nullable = true)
      * |-- date: string (nullable = true)
      * |-- shop: string (nullable = true)
      * |-- transaction_code: string (nullable = true)
      */

original answer 替代-

hive 语法

  1. 以下查询选择除 ds 和 hr 之外的所有列。
  2. Java 正则表达式语法
SELECT `(ds|hr)?+.+` FROM sales

Spark 语法

蟒蛇

df = spark.createDataFrame([("a", 1), ("b", 2), ("c",  3)], ["Col1", "Col2"])
df.select(df.colRegex("`(Col1)?+.+`")).show()
+----+
|Col2|
+----+
|   1|
|   2|
|   3|
+----+

斯卡拉

df.select(df.colRegex("`(account_id|credit_card_limit)?+.+`"))
      .printSchema()

    /**
      * root
      * |-- credit_card_Number: long (nullable = true)
      * |-- first_name: string (nullable = true)
      * |-- last_name: string (nullable = true)
      * |-- phone_number: integer (nullable = true)
      * |-- amount: integer (nullable = true)
      * |-- date: string (nullable = true)
      * |-- shop: string (nullable = true)
      * |-- transaction_code: string (nullable = true)
      */

另一种方法

df.printSchema()

    /**
      * root
      * |-- account_id: integer (nullable = true)
      * |-- credit_card_Number: long (nullable = true)
      * |-- credit_card_limit: integer (nullable = true)
      * |-- first_name: string (nullable = true)
      * |-- last_name: string (nullable = true)
      * |-- phone_number: integer (nullable = true)
      * |-- amount: integer (nullable = true)
      * |-- date: string (nullable = true)
      * |-- shop: string (nullable = true)
      * |-- transaction_code: string (nullable = true)
      */

    // hive syntax
    // The following query selects all columns except ds and hr.
    // SELECT `(ds|hr)?+.+` FROM sales
    // Java regex syntax

    df.selectExpr(df.columns.filter(_.matches("(account_id|credit_card_limit)?+.+")): _*)
      .printSchema()

    /**
      * root
      * |-- credit_card_Number: long (nullable = true)
      * |-- first_name: string (nullable = true)
      * |-- last_name: string (nullable = true)
      * |-- phone_number: integer (nullable = true)
      * |-- amount: integer (nullable = true)
      * |-- date: string (nullable = true)
      * |-- shop: string (nullable = true)
      * |-- transaction_code: string (nullable = true)
      */

参考-hive LanguageManual

【讨论】:

  • 在 spark.sql 的情况下,我应该使用相同的逻辑吗?
  • 我不认为,spark sql 会解析它。使用 spark DSL api
  • 您可以使用df.columns.filter(_.matches("(account_id|credit_card_limit)?+.+") 创建一个变量并在spark sql select 表达式中使用相同的变量
  • 这是我得到的错误。无法解析'(cstone_feed_key|cstone_last_updatetm|rte_call_key_seq_no)?+.+
  • 在spark sql中不能直接使用
猜你喜欢
  • 1970-01-01
  • 2016-07-11
  • 2020-04-12
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多