如何在Spark SQL中执行多行SQL

18

我该如何在Spark SQL中执行冗长的、多行的Hive查询?例如下面的查询:

val sqlContext = new HiveContext (sc)
val result = sqlContext.sql ("
 select ...
 from ...
");

4
请改进您的帖子,没有人想看到代码截图。 - mtoto
6个回答

25

使用"""替代,例如:

Use """ instead, so for example

val results = sqlContext.sql ("""
     select ....
     from ....
""");

或者,如果您想格式化代码,请使用:

val results = sqlContext.sql ("""
     |select ....
     |from ....
""".stripMargin);

那个管道符号是用来做什么的? - GadaaDhaariGeek
1
stripMargin 需要使用管道符号,例如请参考 oreilly multiline strings - Ken Jiiii
@KenJiiii 你说得对。我没有立即回复,后来忘记了,谢谢你的澄清。 - T. Gawęda

6

您可以在SQL代码的开头/结尾使用三引号,或在每行末尾使用反斜杠。

val results = sqlContext.sql ("""
    create table enta.scd_fullfilled_entitlement as
    select *
    from my_table
    """);

results = sqlContext.sql (" \
    create table enta.scd_fullfilled_entitlement as \
    select * \
    from my_table \
    ")

Python中也可以使用三引号(双引号和单引号都可以)。反斜杠已经过时了。 - user6022341
谢谢,已编辑。过时了吗?根据Stype指南https://www.python.org/dev/peps/pep-0008/,并不是这样。 - Ricardo

1
val query = """(SELECT
      a.AcctBranchName,
    c.CustomerNum,
    c.SourceCustomerId,
    a.SourceAccountId,
    a.AccountNum,
    c.FullName,
    c.LastName,
    c.BirthDate,
    a.Balance,
    case when [RollOverStatus] = 'Y' then 'Yes' Else 'No' end as RollOverStatus
    FROM
    v_Account AS a left join v_Customer AS c
      ON c.CustomerID = a.CustomerID AND c.Businessdate = a.Businessdate
    WHERE
    a.Category = 'Deposit' AND
    c.Businessdate= '2018-11-28'  AND
    isnull(a.Classification,'N/A') IN ('Contractual Account','Non-Term Deposit','Term Deposit')
    AND IsActive = 'Yes' ) tmp """

0
除了上述方法,您也可以使用以下方式:
val results = sqlContext.sql("select .... " +
" from .... " +
" where .... " +
" group by ....
");

0
值得注意的是,长度并不是问题,重要的是写作。为此,您可以像Gaweda建议的那样使用""",或者仅使用字符串变量,例如通过使用字符串构建器。例如:
val selectElements = Seq("a","b","c")
val builder = StringBuilder.newBuilder
builder.append("select ")
builder.append(selectElements.mkString(","))
builder.append(" where d<10")
val results = sqlContext.sql(builder.toString())

在使用append时,不需要使用val参数 :) - T. Gawęda

0

在三引号内编写您的 SQL 代码,例如 """ sql 代码 """

df = spark.sql(f""" select * from table1 """)

这对于Scala Spark和PySpark来说是一样的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接