如何在PySpark中使用Spark的registerDataFrameAsTable?

时间:2018-09-25 14:19:53

标签: apache-spark pyspark

使用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") 参数。

1 个答案:

答案 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|
#+---+------+-----+