Pyspark 数据框作为视图

Posted

技术标签:

【中文标题】Pyspark 数据框作为视图【英文标题】:Pyspark Dataframes as View 【发布时间】:2019-05-13 14:32:23 【问题描述】:

对于我正在运行的脚本,我有一堆查看 sql 中特定数据集的链式视图(我正在使用 Apache Spark SQL):

%sql
create view view_1 as
select column_1,column_2 from original_data_table

这个逻辑在view_n 中达到顶峰。 但是,我需要执行在 sql 中难以(或不可能)实现的逻辑,特别是 explode 命令:

%python
df_1 = sqlContext.sql("SELECT * from view_n")
df1_exploded=df_1.withColumn("exploded_column", explode(split(df_1f.col_to_explode,',')))

我的问题:

    在 sql 表和 pyspark 数据帧之间切换是否存在速度成本?或者,由于 pyspark 数据帧是延迟评估的,它与视图非常相似吗?

    有没有更好的方法从 sql 表切换到 pyspark 数据帧?

【问题讨论】:

【参考方案1】:

您可以通过 Spark SQL (https://spark.apache.org/docs/latest/api/sql/index.html) 使用 explode() 以及 DF 拥有的任何东西

print(spark.version)
2.4.3

df = spark.createDataFrame([(1, [1,2,3]), (2, [4,5,6]), (3, [7,8,9]),],["id", "nest"])
df.printSchema()

root
 |-- id: long (nullable = true)
 |-- nest: array (nullable = true)
 |    |-- element: long (containsNull = true)

df.createOrReplaceTempView("sql_view")
spark.sql("SELECT id, explode(nest) as un_nest FROM sql_view").show()

df.createOrReplaceTempView("sql_view")
spark.sql("SELECT id, explode(nest) as flatten FROM sql_view").show()

+---+-------+
| id|flatten|
+---+-------+
|  1|      1|
|  1|      2|
|  1|      3|
|  2|      4|
|  2|      5|
|  2|      6|
|  3|      7|
|  3|      8|
|  3|      9|
+---+-------+

【讨论】:

我不知道!谢谢。但是,如果我想使用 pyspark,你知道如何在使用 Spark SQL 创建的视图上这样做吗? sure ... df = spark.sql("sql from view here") ... 视图只是通常从表等持久对象调用的 sql 查询,以显示一些聚合/KPI,因此据我所知,您只需阅读在视图的 sql 字符串中作为 df,但最好将视图保持为 sql 而不是 df,这样您就不会复制对象并且必须从 dfs 提升新视图,因为它会创建太多依赖项

以上是关于Pyspark 数据框作为视图的主要内容,如果未能解决你的问题,请参考以下文章

在 pyspark sql 的连接中重复使用相同的数据框视图

为啥在 pyspark 中加入两个临时视图后删除列不起作用,但它适用于数据框连接?

Pyspark - 在作为列表的 spark 数据框列上使用 reducebykey

PySpark - 将列表作为参数传递给 UDF + 迭代数据框列添加

重构pyspark数据框

Pyspark:如何将现有非空列的元组列表作为数据框中的列值之一返回