PySpark:SQLContext临时表未返回任何表

时间:2019-03-28 07:28:23

标签: pyspark

我对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. 假设第一个问题已解决,将df_cv_temp导出到HIVE表的最佳方法是什么?

P.S。我正在使用PySaprk 2.0

更新:结合吉姆的答案

收到Jim的答复,我已经更新了代码。请参阅下面的修订代码。

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 :(得分:0)

代替

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()

如果您确定有足够的内存空间,则可以像下面这样直接将其持久保留为配置单元表。这将物理上创建一个托管的Hive表。您甚至可以在Hive CLI中对其进行查询。

df.write.saveAsTable("table1")