Spark中DataFrame的列的三种表示方法

本文介绍了在Spark中DataFrame的列的三种表示方法:通过col()函数、使用$符号和列名、以及使用单引号加列名。示例展示了如何在Inner Join操作中使用这些方法来明确指定列,并指出前三种方式在某些情况下是等价的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先定义参与Join的DataFrames:

val EmployeeDF = Seq[(String, Integer)](
  ("Rafferty", 31),
  ("Timothy", 32),
  ("Jones", 33),
  ("Heisenberg", 33),
  ("Robinson", 34),
  ("Smith", 34),
  ("Williams", null)
).toDF("LastName", "DepartmentID")

val ExDF = Seq[(Integer, String)](
  (31, "Sales"),
  (33, "Engineering"),
  (34, "Clerical"),
  (35, "Marketing"),
  (null, "CEO")
).toDF("ExID", "DepartmentName")

这里给出两个DataFrames做Inner Join的简单例子

scala> EmployeeDF.join(ExDF, col("DepartmentID")===col("ExID")).show
+----------+------------+----+--------------+
|  LastName|DepartmentID|ExID|DepartmentName|
+----------+------------+----+--------------+
|  Rafferty|          31|  31|         Sales|
|     Jones|          33|  33|   Engineering|
|Heisenberg|          33|  33|   Engineering|
|  Robinson|          34|  34|      Clerical|
|     Smith|          34|  34|      Clerical|
+----------+------------+----+--------------+


scala> EmployeeDF.join(ExDF, $"DepartmentID"===$"ExID").show
+----------+------------+----+--------------+
|  LastName|DepartmentID|ExID|DepartmentName|
+----------+------------+----+--------------+
|  Rafferty|          31|  31|         Sales|
|     Jones|          33|  33|   Engineering|
|Heisenberg|          33|  33|   Engineering|
|  Robinson|          34|  34|      Clerical|
|     Smith|          34|  34|      Clerical|
+----------+------------+----+--------------+


scala> EmployeeDF.join(ExDF, 'DepartmentID==='ExID).show
+----------+------------+----+--------------+
|  LastName|DepartmentID|ExID|DepartmentName|
+----------+------------+----+--------------+
|  Rafferty|          31|  31|         Sales|
|     Jones|          33|  33|   Engineering|
|Heisenberg|          33|  33|   Engineering|
|  Robinson|          34|  34|      Clerical|
|     Smith|          34|  34|      Clerical|
+----------+------------+----+--------------+


scala> EmployeeDF.join(ExDF, EmployeeDF("DepartmentID")===ExDF("ExID")).show
+----------+------------+----+--------------+
|  LastName|DepartmentID|ExID|DepartmentName|
+----------+------------+----+--------------+
|  Rafferty|          31|  31|         Sales|
|     Jones|          33|  33|   Engineering|
|Heisenberg|          33|  33|   Engineering|
|  Robinson|          34|  34|      Clerical|
|     Smith|          34|  34|      Clerical|
+----------+------------+----+--------------+

表示关系的参数joinExprs的类型是Column,而这里需要表达式的结果是值为true或false的Column类型,这必然会使用已有DataFrames中的列。由上面的例子可以看到有四种表示DataFrame中列的方法:

  • 使用列函数col(),将列名字的字符串作为该函数的参数。
  • 简单地使用$和字符串,就表示了名字为这个字符串的列。显然,这要求关系式中两边列的名字必须不同,否则就无法区分它们。
  • 在可以明确区分关系列名字的边界的时候,即后面接着非字母数字时,可以用更简单的表示方法:单引号 ' 加列名字
  • 第二个例子则是用DataFrame的名字括上了列名的字符串,就非常明确地表示了这个DataFrame的列。即使两列的名字相同也能区分它们。

可以看到,实际上前三种方法是等价的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值