将RDD的值传递给另一个RDD作为变量 - Spark #Pyspark

时间:2018-05-22 02:32:51

标签: apache-spark dataframe pyspark rdd

我目前正在探索如何通过sqlContext调用大型hql文件(包含插入到select语句中的100行)。

另一件事是,hqls文件是参数化的,所以当从sqlContext调用它时,我也想传递参数。

已经浏览了很多博客和帖子,但没有找到任何答案。

我尝试的另一件事是将rdd的输出存储到变量中。

pyspark

max_date=sqlContext.sql("select max(rec_insert_date) from table")

现在想将max_date作为变量传递给next rdd

incremetal_data=sqlConext.sql(s"select count(1) from table2 where rec_insert_date > $max_dat")

这不起作用,而且max_date的值为=

u[row-('20018-05-19 00:00:00')]

现在还不清楚如何修剪那些额外的角色。

2 个答案:

答案 0 :(得分:0)

sql Context重新命令数据集[Row]。您可以通过

从那里获得价值
max_date=sqlContext.sql("select count(rec_insert_date) from table").first()[0]

在Spark 2.0+中使用spark Session你可以

 max_date=spark.sql("select count(rec_insert_date) from table").rdd.first()[0]

从返回的数据框中获取底层rdd

答案 1 :(得分:0)

您不应该使用max(rec_insert_date)代替count(rec_insert_date)吗?

将两个查询返回的值传递给另一个查询时,有两个选项:

  1. 使用collect,它将触发计算并将返回值分配给变量

    max_date = sqlContext.sql("select max(rec_insert_date) from table").collect()[0][0] # max_date has actual date assigned to it incremetal_data = sqlConext.sql(s"select count(1) from table2 where rec_insert_date > '{}'".format(max_date))

    另一个(也是更好的)选项是使用Dataframe API

    from pyspark.sql.functions import col, lit incremental_data = sqlContext.table("table2").filter(col("rec_insert_date") > lit(max_date))

  2. 使用交叉连接 - 如果第一个查询的结果超过1,则应避免使用交叉连接。优点是您不会破坏处理图,因此Spark可以优化所有内容。

    max_date_df = sqlContext.sql("select max(rec_insert_date) as max_date from table") # max_date_df is a dataframe with just one row incremental_data = sqlContext.table("table2").join(max_date_df).filter(col("rec_insert_date") > col("max_date"))

  3. 至于你首先质疑如何从Spark调用大型hql文件:

    您可以从sqlContext.sql(...)方法中插入im开始,根据我的经验,这通常可行,并且是将逻辑重写为DataFrames / Datasets API的一个很好的起点。在群集中运行它时可能会出现一些问题,因为您的查询将由Spark的SQL引擎(Catalyst)执行,并且不会传递给Hive。