【问题标题】:How to select constant values from Dataframe coding in Java如何从 Java 中的 Dataframe 编码中选择常量值
【发布时间】:2016-08-26 20:15:48
【问题描述】:

我有一个列数固定的数据框 df1。我已经应用了另一个数据框 df2 的内部连接。

但是,在编写 select 时,我需要选择一些我目前无法选择的常数。

我已经阅读了 scala 中的示例,但相应的 java 不起作用。

df1.join(df2).filter(df1.col("a1").$eq$eq$eq(df2.col("a1")))
.select(df1.col("a1"), df1.col("a2"), df2.col("a2"), 8)

如上例所示,建议一种选择 8 的方法。

我也知道withColumn api,但不确定实现。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    这应该可行。

    val joinedDF = df1.join(df2).filter(df1.col("a1").$eq$eq$eq(df2.col("a1")))
    .select(df1.col("a1"), df1.col("a2"), df2.col("a2")).withColumn("constant", lit(8))
    

    也就是说,如果你想添加一个整数。如果你想添加一个常量字符串,在select之后使用这个

    .withColumn("constantString",lit("some_string"))
    

    【讨论】:

    • 这只会显示“常量”值。或者我想我需要使用常量值再次选择较早的。
    • @kks 这将导致您在加入后拥有的所有列以及要显示的常量值。不仅仅是常数值。如果您只看到常量值,则可能是您的查询存在问题。在这里发布您的查询,我可以帮助您调试它。
    • 谢谢。那行得通。我发现我的查询有问题。 @dheee
    【解决方案2】:

    用纯sql来做这个任务怎么样?

    df1.registerAsTempTable("df1");
    df2.registerAsTempTable("df2");
    
    val joinedDf = hc.sql("Select df1.a1, df1.a2, df2.a2, 8 from df1 inner join df2 on df1.a1 = df2.a1");
    

    【讨论】:

    • 我试过了,它也有效。谢谢。但是,我更关心使用数据框类来解决它。使用 sql 方法添加一个常量值将让我更改我的整个数据框连接,从而产生大约 72 列。这可能很乏味。因此,查询。
    • 你可能是正确的,也可能不是。因为这里的 sql 是在数据帧本身上运行的,并且您在代码中使用的数据帧类将与此处调用的相同。这只是使用数据框类的另一种方式,几乎没有区别。现在我不确定如何在 spark 数据帧中优化连接,所以不能评论它是否会制作完整的 72 列中间表然后选择 5 列,或者只制作只有 5 列的中间连接表,理想情况下它不应该触及列不是输出或条件的一部分。
    • 从上面开始,我所做的是使用纯 sql 将常量值选择到另一个数据帧中。确保它们可以与已经存在的数据框连接。然后使用 .select() 检索它们。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2013-06-08
    相关资源
    最近更新 更多