当前位置: 首页 > 面试题库 >

如何使用Python在Spark中执行两个RDD表的基本联接?

万涵亮
2023-03-14
问题内容

您将如何使用python在Spark中执行基本联接?在R中,您可以使用merg()进行此操作。在spark上使用python的语法是什么:

  1. 内部联接
  2. 左外连接
  3. 交叉连接

具有两个表(RDD),每个表中的单个列具有一个公共键。

RDD(1):(key,U)
RDD(2):(key,V)

我认为内部联接是这样的:

rdd1.join(rdd2).map(case (key, u, v) => (key, ls ++ rs));

是对的吗?我已经在互联网上搜索了,找不到很好的加入示例。提前致谢。


问题答案:

可以使用PairRDDFunctions或Spark数据帧来完成。由于数据帧操作受益于Catalyst
Optimizer,
因此第二个选项值得考虑。

假设您的数据如下所示:

rdd1 =  sc.parallelize([("foo", 1), ("bar", 2), ("baz", 3)])
rdd2 =  sc.parallelize([("foo", 4), ("bar", 5), ("bar", 6)])

使用PairRDD:

内部联接:

rdd1.join(rdd2)

左外连接:

rdd1.leftOuterJoin(rdd2)

笛卡尔积(不需要RDD[(T, U)]):

rdd1.cartesian(rdd2)

广播加入(不需要RDD[(T, U)]):

  • 请参见Spark:将2元组键RDD与单键RDD结合在一起的最佳策略是什么?

最后,cogroup它没有直接的SQL等效项,但在某些情况下可能有用:

cogrouped = rdd1.cogroup(rdd2)

cogrouped.mapValues(lambda x: (list(x[0]), list(x[1]))).collect()
## [('foo', ([1], [4])), ('bar', ([2], [5, 6])), ('baz', ([3], []))]

使用Spark数据框

您可以使用SQL DSL或使用来执行原始SQL sqlContext.sql

df1 = spark.createDataFrame(rdd1, ('k', 'v1'))
df2 = spark.createDataFrame(rdd2, ('k', 'v2'))

# Register temporary tables to be able to use `sparkSession.sql`
df1.createOrReplaceTempView('df1')
df2.createOrReplaceTempView('df2')

内部联接:

# inner is a default value so it could be omitted
df1.join(df2, df1.k == df2.k, how='inner') 
spark.sql('SELECT * FROM df1 JOIN df2 ON df1.k = df2.k')

左外连接:

df1.join(df2, df1.k == df2.k, how='left_outer')
spark.sql('SELECT * FROM df1 LEFT OUTER JOIN df2 ON df1.k = df2.k')

交叉连接(在Spark 2.0中需要显式交叉连接或配置更改-Spark
2.x的spark.sql.crossJoin.enabled
):

df1.crossJoin(df2)
spark.sql('SELECT * FROM df1 CROSS JOIN df2')

~~~~

df1.join(df2)
sqlContext.sql('SELECT * FROM df JOIN df2')

从1.6(Scala中为1.5)开始,这些broadcast功能都可以与功能结合使用:

from pyspark.sql.functions import broadcast

df1.join(broadcast(df2), df1.k == df2.k)

执行广播加入。另请参阅为什么我的BroadcastHashJoin比Spark中的ShuffledHashJoin慢



 类似资料:
  • 问题内容: 如何在Python中串联两个列表? 例: 预期结果: 问题答案: 你可以使用+运算符来组合它们: 输出:

  • 我有2%s: 我需要这样的联合: 函数不起作用,因为列的编号和名称不同。 我怎么能这么做?

  • 问题内容: 我开始将DataTables Table插件用于jQuery ,但遇到了一些问题。我从这里使用示例代码。 我有MySQL表女巫看起来像这样: id | 名称| Father_id 是同一表中仅在不同行中的值。因此,如果我想知道父亲的名字,我必须在同一个表中进行搜索。但是DataTable所做的只是按原样显示MySQL表的内容。 在我的数据表中,我想显示如下数据: id | 名称| 父亲

  • 我有两张桌子, 我想为changelog实现一个搜索方法,该方法返回字段 如您所见,结果来自两个表的联接。 我发现https://gorm.io/docs/preload.html 但老实说,我不明白我该如何实现我所需要的。 我认为下面的内容可能会有所帮助 问题是,如何从GORM中提到的表格中获得我提到的内容?

  • 问题内容: 我有两个列表,我想按元素将它们连接起来。列表之一在连接之前要经过字符串格式化。 例如 : 在这种情况下,要进行字符串格式化。也就是说,new或应为: 最终输出应为: 有人可以告诉我该怎么做吗? 问题答案: 用途 :

  • 问题内容: 我有两个表和相关的Java映射。 这是我的Java实体。国家POJO: 和用户POJO: 问题是,我怎么能加入到在Hibernate中使用注释?当我使用Hibernate创建User对象时,我需要自动绑定这两个字段(代码和countryCode)。 问题答案: 您需要从映射到实体,并从映射到: