使用reshape2::melt()
时遇到麻烦。根据文档,它似乎位于registerDataFrameAsTable
类中,因此我自然尝试了这一点:
sqlContext
但这导致了此错误:
df = spark.registerDataFrameAsTable(mydf, "table1")
我也尝试过:
AttributeError: 'SparkSession' object has no attribute 'registerDataFrameAsTable'
但是导致了这个奇怪的错误:
TypeError:registerDataFrameAsTable()缺少1个必需的位置参数:“ tableName”
这似乎是使用该函数的错误方法,因为它看起来像我必须显式命名参数,并且还期望使用from pyspark.sql import SQLContext
df = SQLContext.registerDataFrameAsTable(mydf, "table1")
参数。
答案 0 :(得分:3)
我建议您将应用程序迁移到pyspark 2.x,或者如果您学习从2.x开始。我在下面提供了2.x和1.x的代码。
SPARK 2.X
如果您有Spark DataFrame df
:
df.show(5)
#+---+---+---+---+---+------+
#|_c0|_c1|_c2|_c3|_c4| _c5|
#+---+---+---+---+---+------+
#| 1|5.1|3.5|1.4|0.2|setosa|
#| 2|4.9| 3|1.4|0.2|setosa|
#| 3|4.7|3.2|1.3|0.2|setosa|
#| 4|4.6|3.1|1.5|0.2|setosa|
#| 5| 5|3.6|1.4|0.2|setosa|
#+---+---+---+---+---+------+
您可以使用createOrReplaceTempView
将其注册为表格:
df.createOrReplaceTempView("people")
spark.sql("select * from people").show(n=5)
#+---+---+---+---+---+------+
#|_c0|_c1|_c2|_c3|_c4| _c5|
#+---+---+---+---+---+------+
#| 1|5.1|3.5|1.4|0.2|setosa|
#| 2|4.9| 3|1.4|0.2|setosa|
#| 3|4.7|3.2|1.3|0.2|setosa|
#| 4|4.6|3.1|1.5|0.2|setosa|
#| 5| 5|3.6|1.4|0.2|setosa|
#+---+---+---+---+---+------+
或者,您可以使用createGlobalTempView
:
df.createGlobalTempView("people_global")
tempdf=spark.sql("select * from people_global")
tempdf.show(n=5)
#+---+---+---+---+---+------+
#|_c0|_c1|_c2|_c3|_c4| _c5|
#+---+---+---+---+---+------+
#| 1|5.1|3.5|1.4|0.2|setosa|
#| 2|4.9| 3|1.4|0.2|setosa|
#| 3|4.7|3.2|1.3|0.2|setosa|
#| 4|4.6|3.1|1.5|0.2|setosa|
#| 5| 5|3.6|1.4|0.2|setosa|
#+---+---+---+---+---+------+
但是,如果名称已经存在,则会抛出TempTableAlreadyExistsException
。
SPARK 1.X
您可以使用pyspark.sql.SQLContext.registerDataFrameAsTable
:
from pyspark.sql import Row
df = sc.parallelize(
[
Row(name='Alice', age=5, height=80),
Row(name='Alice', age=5, height=80),
Row(name='Alice', age=10, height=80)
]
).toDF()
df.show()
#+---+------+-----+
#|age|height| name|
#+---+------+-----+
#| 5| 80|Alice|
#| 5| 80|Alice|
#| 10| 80|Alice|
#+---+------+-----+
sqlContext.registerDataFrameAsTable(df, "table1")
dftemp=sqlContext.sql("select * from table1")
dftemp.show()
#+---+------+-----+
#|age|height| name|
#+---+------+-----+
#| 5| 80|Alice|
#| 5| 80|Alice|
#| 10| 80|Alice|
#+---+------+-----+