java - 如何动态填充数据框的选择子句?给出 AnalysisException

标签 java dataframe apache-spark apache-spark-sql

我正在使用spark-sql 2.4.1和java 8。

 val country_df = Seq(
    ("us",2001),
    ("fr",2002),
    ("jp",2002),
    ("in",2001),
    ("fr",2003),
    ("jp",2002),
    ("in",2003)
    ).toDF("country","data_yr")

> val col_df = country_df.select("country").where($"data_yr" === 2001)

    val data_df = Seq(
    ("us_state_1","fr_state_1" ,"in_state_1","jp_state_1"),
    ("us_state_2","fr_state_2" ,"in_state_2","jp_state_1"),
    ("us_state_3","fr_state_3" ,"in_state_3","jp_state_1")
    ).toDF("us","fr","in","jp")

> data_df.select("us","in").show()

如何从给定年份的 Country_df 动态填充此选择子句(data_df)?

即从第一个数据帧中,我将获得列的值,这些是 我需要从第二个数据中选择的列。怎么会这样 完成了吗?

Tried this :

List<String> aa = col_df.select(functions.lower(col("data_item_code"))).map(row -> row.mkString(" ",", "," "), Encoders.STRING()).collectAsList();
 data_df.select(aa.stream().map(s -> new Column(s)).toArray(Column[]::new));

错误:

.AnalysisException: cannot resolve '` un `' given input columns: [abc,.....all columns ...]

那么这里出了什么问题,如何解决这个问题?

最佳答案

您可以尝试使用以下代码。

从第一个数据集中选择列名称。

List<String> columns = country_df.select("country").where($"data_yr" === 2001).as(Encoders.STRING()).collectAsList();

使用第二个数据集中的 selectexpr 中的列名称。

public static Seq<String> convertListToSeq(List<String> inputList) {
        return JavaConverters.asScalaIteratorConverter(inputList.iterator()).asScala().toSeq();
}


//using selectExpr
data_df.selectExpr(convertListToSeq(columns)).show(true);

关于java - 如何动态填充数据框的选择子句?给出 AnalysisException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59669880/

相关文章:

java - JGroups 未找到或加载主类

json - Scala通过带有 yarn 的Spark - 缺少大括号字符串

java - 使应用程序从MySQL数据库检索数据

java - Eclipse、Maven 和代码覆盖率

java - 为什么 ChannelHandlerContext.writeAndFlush() 不处理我的字符串?

python - Pandas 数据框中两列的条件测试和比较

python - 选择pd.Dataframe中的逆向索引

r - 有没有什么方法可以使用 Shiny 的操作按钮递归地将行添加到 data.frame 中?

performance - 我应该把程序放在 HDFS 上吗?

hadoop - 退出代码和退出状态是否意味着 Spark ?