我有多个重复的列(由于连接)如果我尝试通过别名调用它们,我得到一个模糊的引用错误:
引用'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开始,我们可以将它们重命名为type1
和type2
:
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 ...