PySpark: временная таблица SQLContext не возвращает ни одной таблицы - PullRequest
0 голосов
/ 28 марта 2019

Я новичок в PySpark. Поэтому этот вопрос может показаться довольно элементарным для других. Я пытаюсь экспортировать фрейм данных, созданный с помощью createOrReplaceTempView(), в Hive. Шаги следующие:

sqlcntx = SQLContext(sc)
df = sqlcntx.read.format("jdbc").options(url="sqlserver://.....details of MS Sql server",dbtable = "table_name").load()
df_cv_temp = df.createOrReplaceTempView("df")

Когда я использую df_cv_temp.show(5), выдает ошибку следующим образом

NoneType Object has no attribute 'show'

Интересно, когда я пытаюсь увидеть df.show(5), я получаю правильный вывод. Естественно, когда я вижу вышеупомянутую ошибку, я не могу продолжить.

Теперь у меня два вопроса.

  1. Как исправить вышеуказанную проблему?
  2. Если учесть 1-й вопрос, каков наилучший способ экспорта df_cv_temp в таблицы HIVE?

P.S. Я использую PySaprk 2.0

Обновление: включение ответа Джима

Опубликовать ответ, полученный от Джима, я обновил код. Пожалуйста, смотрите ниже пересмотренный код.

from pyspark.sql import HiveContext,SQLContext
sql_cntx = SQLContext(sc)
df = sqlcntx.read.format("jdbc").options(url="sqlserver://.....details of MS Sql server",dbtable = "table_name").load()
df_curr_volt.createOrReplaceTempView("df_cv_temp")
df_cv_filt = sql_cntx.sql("select * from df_cv_temp where DeviceTimeStamp between date_add(current_date(),-1) and current_date()") # Retrieving just a day's record
hc = HiveContext(sc)

Теперь проблема начинается. Пожалуйста, обратитесь к моему вопросу 2.

df_cv_tbl = hc.sql("create table if not exits df_cv_raw as select * from df_cv_filt")
df_cv_tbl.write.format("orc").saveAsTable("df_cv_raw")

Приведенные выше две строки вызывают ошибку, как показано ниже.

pyspark.sql.utils.AnalysisException: u'Table or view not found: df_cv_filt; line 1 pos 14'

Так каков правильный подход к этому?

1 Ответ

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

вместо

df_cv_temp = df.createOrReplaceTempView("df") 

вы должны использовать,

df.createOrReplaceTempView("table1")

Это потому, что df.createOrReplaceTempView(<name_of_the_view>) создает (или заменяет, если это имя представления уже существует) лениво оцененное «представление», которое затем можно использовать как таблицу кустов в Spark SQL. Выражение не производит никакого вывода как таковое, следовательно, это NoneType объект.

Кроме того, временное представление можно запросить, как показано ниже:

spark.sql("SELECT field1 AS f1, field2 as f2 from table1").show()

Incase, у вас наверняка есть место в памяти, тогда вы можете сохранить его в виде таблицы улья , как показано ниже. Это создаст управляемую таблицу Hive физически; по которому вы можете запросить его даже в вашем Hive CLI.

df.write.saveAsTable("table1")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...