在Spark Dataframe中按id引用列



我有多个重复的列(由于连接)如果我尝试通过别名调用它们,我得到一个模糊的引用错误:

引用'customers_id'是不明确的,可以是:customers_id#13, customers_id#85, customers_id#130

是否有一种方法来引用一个列在一个Scala Spark数据框架的顺序在数据框架或数字ID,而不是一个别名?经过处理的名称表明列确实分配了id(在下面的示例中为13、85、130)

LATER EDIT:

我发现我可以通过它所在的原始数据帧引用特定的列。但是,虽然我可以在选择函数中使用OriginalDataframe.customer_id,但withColumnRename函数只接受字符串别名,因此我不能在最后的dataframe中重命名重复列。

所以,我想最后的问题是:是否有一种方法来引用一个列,有一个重复的别名,这与所有需要字符串别名作为参数的函数?

LATER EDIT 2:

重命名似乎通过添加一个新列并删除一个当前列来工作:

joined_dataframe = joined_dataframe.withColumn("renamed_customers_id", original_dataframe("customers_id")).drop(original_dataframe("customers_id"))

但是,我想让我的问题保持开放:

是否有一种方法可以引用具有重复别名的列(因此,使用别名以外的东西),以便所有期望字符串别名的函数都接受它?

摆脱这种情况的一种方法是使用旧Dataframe的rdd创建一个新的Dataframe,但是使用一个新的模式,您可以随意命名每个列。当然,这要求您显式地描述整个模式,包括每个列的类型。只要您提供的新模式匹配旧Dataframe的列数和列类型,这应该可以工作。

例如,从具有两列命名为type的Dataframe开始,我们可以将它们重命名为type1type2:

df.show()
// +---+----+----+
// | id|type|type|
// +---+----+----+
// |  1| AAA| aaa|
// |  1| BBB| bbb|
// +---+----+----+
val newDF = sqlContext.createDataFrame(df.rdd, new StructType()
  .add("id", IntegerType)
  .add("type1", StringType)
  .add("type2", StringType)
)
newDF.show()
// +---+-----+-----+
// | id|type1|type2|
// +---+-----+-----+
// |  1|  AAA|  aaa|
// |  1|  BBB|  bbb|
// +---+-----+-----+ 

主要问题是join,而不是使用python。

h1.createOrReplaceTempView("h1")
h2.createOrReplaceTempView("h2")
h3.createOrReplaceTempView("h3")
joined1 = h1.join(h2, (h1.A == h2.A) & (h1.B == h2.B) & (h1.C == h2.C), 'inner')  

结果数据框列:

A B Column1 Column2 A B Column3 ...

我不喜欢这样,但是join必须这样实现:

joined1 = h1.join(h2, [*argv], 'inner')

我们假设argv = ["A", "B", "C"]

结果列:

A B column1 column2 column3 ...

相关内容

  • 没有找到相关文章

最新更新