Синтаксис для выражения имен столбцов VALUES-предложения? - PullRequest
0 голосов
/ 03 октября 2019

Это выполняется,

val r = sql("SELECT T.* FROM ( VALUES ('xx','xxx','2019-01-01'), ('xxxx','yyyy','2019-01-02') ) T")

, но r имеют столбцы "без имени", обозначенные как col1| col2| col3. В стандартном SQL я могу выражать имена как параметры таблицы, что-то вроде T(a,b,c) вместо T ... Но это,

val r = sql("SELECT T.* FROM ( VALUES ('xx','xxx','2019-01-01'), ('xxxx','yyyy','2019-01-02') ) T(a,b,c)")

не работает, это ужасное сообщение об ошибке , не говорите о правильном синтаксисе Spark для него ...

Вопрос "Как выразить имена столбцов?" , и мне нужен пример, который я могу запустить в spark-shell v2.2.


Примечания

Уродливое сообщение:

org.apache.spark.sql.catalyst.parser.ParseException:
mismatched input '(' expecting {<EOF>, ',', 'WHERE', 'GROUP', 'ORDER', 'HAVING', 'LIMIT', 'JOIN', 'CROSS', 'INNER', 'LEFT', 'RIGHT', 'FULL', 'NATURAL', 'LATERAL', 'WINDOW', 'UNION', 'EXCEPT', 'MINUS', 'INTERSECT', 'SORT', 'CLUSTER', 'DISTRIBUTE', 'ANTI'}(line 1, pos 73)

== SQL ==
SELECT T.*, 'aaa' as chk FROM ( VALUES ('xx','xxx','2019-01-01') ) T (a,b,c)
----------------------------------------------------------------------^^^

  at org.apache.spark.sql.catalyst.parser.ParseException.withCommand(ParseDriver.scala:217)
  at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parse(ParseDriver.scala:114)
  at org.apache.spark.sql.execution.SparkSqlParser.parse(SparkSqlParser.scala:48)
  at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parsePlan(ParseDriver.scala:68)
  at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:637)
  ... 50 elided

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Я подозреваю, что набор данных (VALUES (),(),...) имеет предопределенное имя столбца (col1, col2, ...), поэтому единственный способ переопределить его, это использовать псевдонимы

, так как вам нужностолбцы a, b, c в val r, должны выглядеть так:
SELECT T.col1 as a, T.col2 as b, T.col3 as c FROM ( VALUES ('xx','xxx','2019-01-01'), ('xxxx','yyyy','2019-01-02') ) T

0 голосов
/ 03 октября 2019

Вы можете привести это к кадру данных и указать имена столбцов:

val r = sql("SELECT T.* FROM ( VALUES ('xx','xxx','2019-01-01'), ('xxxx','yyyy','2019-01-02') ) T").toDF("foo","bar","baz")

Или вы можете использовать другой подход к созданию вашего кадра данных:

val r = Seq(("xx","xxx","2019-01-01"),("xxxx","yyyy","2019-01-02")).toDF("foo","bar","baz")

В любом случае, выполучит:

r.show
+----+----+----------+
| foo| bar|       baz|
+----+----+----------+
|  xx| xxx|2019-01-01|
|xxxx|yyyy|2019-01-02|
+----+----+----------+

Не обязательно более симпатично / лучше, чем ответ @ mangusta, просто альтернативный подход.

...