Динамически создавайте внешнюю таблицу Hive с помощью sqlcontext.sql (...) - PullRequest
0 голосов
/ 27 июня 2019

У меня есть сценарий pyspark в записной книжке Zeppelin, который я указываю на файл JSON, хранящийся в хранилище больших двоичных объектов, чтобы вывести схему JSON и создать внешнюю таблицу в Hive.

Я могу взятьКоманда SQL выводится из скрипта и выполняется в отдельном абзаце, а таблица создается просто отлично, однако, когда я пытаюсь создать таблицу с помощью метода sqlcontext.sql (), я получаю следующую ошибку:

AnalysisException: u'org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: MetaException (сообщение: java.lang.ClassNotFoundException Класс org.openx.data.jsonserde.JsonSerDe не найден); '

При поиске этой ошибки просто появляются страницы, гарантирующие, что файл JAR для SerDe находится на сервере, что, очевидно, так как я могу создать эту таблицу вручную.Ниже приведен мой сценарий:

%spark2.pyspark

import os
import datetime as dt
import time
from datetime import date
from pyspark.sql.functions import monotonically_increasing_id, lit
from pyspark.sql.types import *
from pyspark.sql import *
from pyspark.sql.functions import split, lower, unix_timestamp, from_unixtime

hiveDbName = 'dev_phoenix'
hiveTableName = 'et_engagement_cac'
serdeName = 'org.openx.data.jsonserde.JsonSerDe'
jsonFileLocation = 'wasbs://blah-blah-blah@meh-meh-meh.blob.core.windows.net/dev/data/Engagement'

jsonDf = sqlContext.read.json("wasbs://blah-blah-blah@meh-meh-meh.blob.core.windows.net/dev/data/Engagement/Engagement.json")

# jsonDf.printSchema()

extTableDDL = "create external table " + hiveDbName + "." + hiveTableName + "(\n"

for col in jsonDf.dtypes:
    extTableDDL += '`' + col[0] + '` ' + col[1].replace('_id','`_id`') + ',\n'

extTableDDL = extTableDDL[:-2]
extTableDDL += ')\nrow format serde \'' + serdeName + '\'\n'
extTableDDL += 'location \'' + jsonFileLocation + '\'\n'
extTableDDL += 'tblproperties (\'serialization.null.format\'=\'\')'

print extTableDDL

sqlContext.sql(extTableDDL)

Я намеренно запутал имя нашего контейнера WASB, отсюда и бла / ме.

Я нашел несколько сообщений, из-за которых я начинаю думать, что существуют ограничения длятипы таблиц, которые вы можете создать с помощью sqlcontext.sql, и, возможно, то, что я пытаюсь сделать, невозможно?

Мне удалось успешно создать таблицу, когда я вынул объявление SerDe, однако Hive использовалSerDe по умолчанию, который не будет работать для данных, которые у меня есть в базовом файле.

1 Ответ

0 голосов
/ 28 июня 2019

ОК, так что я думаю, что понял, что происходит, и как это исправить. Я подозреваю, что файл JAR для SerDe, который я пытаюсь использовать, находится в каталоге на сервере, которого нет в переменной classpath.

Итак, я сделал первый вызов spark.sql (...), чтобы добавить JAR, и теперь он работает. Смотрите обновленный скрипт ниже;

%spark2.pyspark

import os
import datetime as dt
import time
from datetime import date
from pyspark.sql.functions import monotonically_increasing_id, lit
from pyspark.sql.types import *
from pyspark.sql import *
from pyspark.sql.functions import split, lower, unix_timestamp, from_unixtime

hiveDbName = 'dev_phoenix'
hiveTableName = 'et_engagement_cac'
serdeName = 'org.openx.data.jsonserde.JsonSerDe'
jsonFileLocation = 'wasbs://blah-blah-blah@meh-meh-meh.blob.core.windows.net/dev/data/Engagement'

jsonDf = spark.read.json("wasbs://blah-blah-blah@meh-meh-meh.blob.core.windows.net/dev/data/Engagement/Engagement.json")

# jsonDf.printSchema()

spark.sql('add jar /usr/hdp/current/hive-client/lib/json-serde-1.3.8-jar-with-dependencies.jar')

extTableDDL = "create external table " + hiveDbName + "." + hiveTableName + "(\n"

for col in jsonDf.dtypes:
    extTableDDL += '`' + col[0] + '` ' + col[1].replace('_id','`_id`').replace('_class','`_class`') + ',\n'

extTableDDL = extTableDDL[:-2]
extTableDDL += ')\nROW FORMAT SERDE\n'
extTableDDL += '   \'' + serdeName + '\'\n'
extTableDDL += 'STORED AS INPUTFORMAT\n'
extTableDDL += '   \'org.apache.hadoop.mapred.TextInputFormat\'\n'
extTableDDL += 'OUTPUTFORMAT\n'
extTableDDL += '   \'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat\'\n'

extTableDDL += 'location \'' + jsonFileLocation + '\'\n'
extTableDDL += 'tblproperties (\'serialization.null.format\'=\'\')'

print extTableDDL

spark.sql(extTableDDL)
...