在连接条件之后,DataFrame无法找到列名

时间:2017-08-25 13:40:37

标签: java apache-spark apache-spark-sql

在使用dataframe API执行一个连接操作时,我遇到了一个问题,例如“ sql.AnalysisException:无法解析column_name ”。虽然列名存在,但是当使用HiveContext的SQL格式尝试时,相同的连接操作正常工作。在以下代码库中,

DataFrame df= df1
  .join(df2, df1.col("MERCHANT").equalTo(df2.col("MERCHANT")))
  .select(df2.col("MERCH_ID"), df1.col("MERCHANT")));

我也尝试过“别名”功能,但遇到了同样的问题“无法解析列名”。并抛出以下异常。

  

已解决的属性MERCH_ID#738缺少MERCHANT#737,MERCHANT#928,MERCH_ID#929,MER_LOC#930 in operator!Project [MERCH_ID#738,MERCHANT#737];

     

at org.apache.spark.sql.catalyst.analysis.CheckAnalysis $ class.failAnalysis(CheckAnalysis.scala:38)

Spark版本:1.6

Scala和Java Spark都遇到了这个问题。

在Scala中,问题已使用“别名”解决,但在Java中,我仍然收到错误。

2 个答案:

答案 0 :(得分:7)

根据我的经验,除非消除歧义,否则最好避免DataFrame.colDataFrame.apply(别名仍然更好)。请尝试使用独立的Column个对象:

import org.apache.spark.sql.functions;

DataFrame df= df1.alias("df1").
  .join(df2.alias("df2"), functions.col("df1.MERCHANT").equalTo(functions.col("df2.MERCHANT")))
  .select(functions.col("df2.MERCH_ID"), functions.col("df2.MERCHANT")));

答案 1 :(得分:0)

导入org.apache.spark.sql.functions;

已加入数据集DF = DF1.join(DF2,DF1.col(“ _ c1”)。equalTo(DF2.col(“ _ c1”))));

如果列没有标题,则_c1代表列1