PySpark выбрасывает ParseException для синтаксически правильного запроса Hive - PullRequest
0 голосов
/ 12 марта 2019

Я получил DDL-запрос, который прекрасно работает в beeline, но когда я пытаюсь выполнить тот же запрос в sparkSession, он выдает исключение синтаксического анализа.

from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession, HiveContext

# Initialise Hive metastore
SparkContext.setSystemProperty("hive.metastore.uris","thrift://localhsost:9083")

# Create Spark Session
sparkSession = (SparkSession\
                .builder\
                .appName('test_case')\
                .enableHiveSupport()\
                .getOrCreate())



sparkSession.sql("CREATE EXTERNAL TABLE B LIKE A")

Исключение Pyspark:

pyspark.sql.utils.ParseException: u"\nmismatched input 'LIKE' expecting <EOF>(line 1, pos 53)\n\n== SQL ==\nCREATE EXTERNAL TABLE B LIKE A\n-----------------------------------------------------^^^\n"

Как я могу заставить функцию hiveQL работать в pySpark? Кажется, проблема в том, что запрос выполняется как SparkSQL-Query, а не как HiveQL-Query, хотя я активировал enableHiveSupport для sparkSession.

1 Ответ

0 голосов
/ 13 марта 2019

Запросы Spark SQL по умолчанию используют SparkSQL.Я полагаю, что для включения синтаксиса HiveQL вы должны дать ему подсказку о своем намерении через комментарий.(Справедливости ради, я не думаю, что это хорошо документировано; мне удалось найти только косвенную ссылку на то, что это вещь здесь, и только в версии Scala примера.)

Например, я могу получить команду для анализа, написав:

%sql
-- `USING HIVE`
CREATE TABLE narf LIKE poit

Теперь у меня нет , включена поддержка Hive в моем сеансетак что мой запрос не выполняется ... но он анализирует!


Редактировать: Так как ваш оператор SQL находится в строке Python, вы можете использовать многострочныйстрока для использования синтаксиса однострочных комментариев, например:

sparkSession.sql("""
  -- `USING HIVE`
  CREATE EXTERNAL TABLE B LIKE A
""")

В SQL также есть синтаксис с разделителями комментариев, например,

sparkSession.sql("/* `USING HIVE` */ CREATE EXTERNAL TABLE B LIKE A")

, который также может работать.

...