当前位置: 首页 > 知识库问答 >
问题:

在没有公共列的情况下连接两个数据流

郎成龙
2023-03-14
val df1 has
Customer_name 
Customer_phone
Customer_age

val df2 has
Order_name
Order_ID

这两个dataframe没有任何公共列。两个数据流中的行数和列数也不同。我尝试插入一个新的虚拟列,以增加row_index值,如下val dfr=df1.withcolumn(“row_index”,monotonically_increasing_id())所示。

但由于我使用的是Spark2,因此不支持monotonically_increasing_id方法。有没有办法把两个dataframe连接起来,这样我就可以在一张单张的excel文件中创建两个dataframe的值。

例如:

val df1:
Customer_name  Customer_phone  Customer_age
karti           9685684551     24      
raja            8595456552     22

val df2:
Order_name Order_ID
watch       1
cattoy     2
Customer_name  Customer_phone  Customer_age   Order_name  Order_ID

karti          9685684551      24             watch        1
   
raja           8595456552      22             cattoy      2

共有1个答案

商宏爽
2023-03-14

monotonically_increasing_id()是递增且唯一的,但不是连续的。

您可以使用zipwithindex,方法是转换为rdd并为这两个Dataframe用相同的架构重构Dataframe。

import spark.implicits._


val df1 = Seq(
  ("karti", "9685684551", 24),
  ("raja", "8595456552", 22)
).toDF("Customer_name", "Customer_phone", "Customer_age")


val df2 = Seq(
  ("watch", 1),
  ("cattoy", 2)
).toDF("Order_name", "Order_ID")

val df11 = spark.sqlContext.createDataFrame(
  df1.rdd.zipWithIndex.map {
    case (row, index) => Row.fromSeq(row.toSeq :+ index)
  },
  // Create schema for index column
  StructType(df1.schema.fields :+ StructField("index", LongType, false))
)


val df22 = spark.sqlContext.createDataFrame(
  df2.rdd.zipWithIndex.map {
    case (row, index) => Row.fromSeq(row.toSeq :+ index)
  },
  // Create schema for index column
  StructType(df2.schema.fields :+ StructField("index", LongType, false))
)

现在加入最后的数据流

df11.join(df22, Seq("index")).drop("index")
+-------------+--------------+------------+----------+--------+
|Customer_name|Customer_phone|Customer_age|Order_name|Order_ID|
+-------------+--------------+------------+----------+--------+
|karti        |9685684551    |24          |watch     |1       |
|raja         |8595456552    |22          |cattoy    |2       |
+-------------+--------------+------------+----------+--------+
 类似资料:
  • 问题内容: 嗨,我目前有3个表格,如下所示。表之间没有通用键 表1-> linkage_Table 表2->材料表 表格3-> Color_Table 我希望得到以下结果集 我想编写一条SQL语句将表连接在一起。 链接表中带有*表示我们将从材料或颜色表中检索所有值。 我现在确实需要此解决方案。一直试图解决这个问题超过5个小时。在此先感谢您的帮助。 问题答案: 一种可能的方法: SQL小提琴 说明:

  • 我们是否需要internet连接才能从AWS的实例中使用AWS Java SDK? 从我最初的调查发现,我看到要从Amazon的这个实例运行基于AWS Java SDK的Java程序,该实例需要具有internet连接。 运行AWS Java SDK附带的示例程序AwsConsoleApp,我看到以下错误: [javac]/home/ubuntu/aws-java-sdk-1.8.9.1/samp

  • 我们想要自己的db连接配置而不是使用JNDI,但同时,我们也想使用DataSource而不是使用Drive verManager,怎么做?

  • null 我所尝试的:(我想是愚蠢的) 我有一个类,该对象应该作为共享,这样我就可以将其作为全局使用,而无需实例化它,例如. 这不起作用,我无法将在一个线程中接收到的数据发送到另一个线程。 我知道有一个明显的锁定问题,因为如果一个线程正在写一个对象,其他线程不能访问它,直到第一个线程完成了写。 和类。 我认为,我创建动态线程来为每个连接的客户机服务的方式(共享相同的数据源)不可能使用Global

  • 我有两个数据帧DF1和DF2。 DF1: DF2: 我需要来自DF2的行数,其中EmploymentType='Employee',EmpStatus='Active',EmpStartDate 输出: 如何在不合并两个数据帧的情况下实现这一点? 我不能合并数据帧,因为没有公共键,而且因为我需要基于条件的行数,我不能在任何临时列上加入数据帧,因为我需要避免交叉连接。

  • BLE(低功耗蓝牙)设备应该在不扫描到我的iPhone(应用程序)的情况下连接。 我有通过扫描QRCode得到的BLE地址。 因此,我希望在不调用(manager.scanForPeripherals(withServices:nil))的情况下连接特定的设备(我传递地址的设备),因为它将启动所有设备。 目前,当我找到我的特定设备时,我可以扫描我的BLE设备的二维码并扫描所有可用设备。我正在停止扫