Comment puis-je exécuter de longues requêtes Hive multilignes dans Spark SQL? Comme requête ci-dessous:
val sqlContext = new HiveContext (sc)
val result = sqlContext.sql ("
select ...
from ...
");
Utilisez "" "à la place, donc par exemple
val results = sqlContext.sql ("""
select ....
from ....
""");
ou, si vous voulez formater le code, utilisez:
val results = sqlContext.sql ("""
|select ....
|from ....
""".stripMargin);
Vous pouvez utiliser des guillemets au début/à la fin du code SQL ou une barre oblique inverse à la fin de chaque ligne.
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 \
")
Il convient de noter que la longueur n’est pas le problème, mais seulement l’écriture. Pour cela, vous pouvez utiliser "" "comme suggéré par Gaweda ou simplement utiliser une variable de chaîne, par exemple en la construisant avec le constructeur de chaînes. Par exemple:
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())
Outre les méthodes ci-dessus, vous pouvez également utiliser la méthode ci-dessous:
val results = sqlContext.sql("select .... " +
" from .... " +
" where .... " +
" group by ....
");
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 """