我对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)
时,我得到了正确的输出。
自然,当我看到上述错误时,我将无法继续进行操作。
现在我有两个问题。
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'
那么解决这个问题的正确方法是什么?
答案 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")