Spark Scala 2.11.11:连接表后Select无法显示指定列问题排查
问题排查与修复
核心问题点
- 未保存重命名后的DataFrame:
flData_csv.toDF(...)和customers_csv.toDF(...)的结果未赋值给变量,后续join操作仍使用原始未重命名的表,导致列名关联异常。 - 提前引用不存在的列:
select("packageId", "count", "firstName", "lastName")中的count列在聚合操作前不存在,属于错误引用。 - 分组后丢失用户列:
groupBy("Package ID")仅按包裹ID分组,未将firstName和lastName纳入分组键,聚合后这两列会被直接丢弃,后续的重命名操作毫无意义。 - 过滤时引用错误列名:聚合后已将
count重命名为Number of Packages,但过滤逻辑仍使用原列名count,导致过滤规则失效。
修复后的代码
import org.apache.spark.sql.functions._ import spark.implicits._ // 重命名列并保存为新变量 val flData = flData_csv.toDF("packageId", "flId", "date", "to", "from") val customers = customers_csv.toDF("packageId", "firstName", "lastName") // 方案1:先统计包裹数量再关联用户信息(性能更优) flData.groupBy("packageId") .count() .withColumnRenamed("count", "Number of Packages") .filter(col("Number of Packages") >= 20) .join(customers, Seq("packageId")) .select( col("packageId").alias("Package ID"), col("Number of Packages"), col("firstName").alias("First Name"), col("lastName").alias("Last Name") ) .show(100) // 方案2:先关联表再分组(适用于需验证关联数据的场景) flData.join(customers, Seq("packageId")) .groupBy("packageId", "firstName", "lastName") .count() .withColumnRenamed("count", "Number of Packages") .filter(col("Number of Packages") >= 20) .select( col("packageId").alias("Package ID"), col("Number of Packages"), col("firstName").alias("First Name"), col("lastName").alias("Last Name") ) .show(100)
说明
- 方案1先统计包裹数量再关联用户表,减少了join的数据量,性能更优;需确保
packageId与用户信息是一一对应的关系。 - 方案2先关联两张表再分组,适用于需要先确认关联数据正确性的场景,必须将用户列纳入分组键,避免丢失用户信息。
内容的提问来源于stack exchange,提问作者Kacie
相关产品推荐
相关产品推荐

