问题与DataFrame na()填充方法和模糊引用

问题描述:

我使用的是Spark 1.3.1,其中加入两个数据帧重复加入的列为 。我将左外连接两个数据帧,并希望将结果数据帧发送到na().fill()方法,以根据列的数据类型将空值转换为已知的 值。我已经创建了一个 “table.column” - >“value”的地图并将其传递给fill方法。但我得到 异常,而不是成功:(我有什么选择?我看到有一个dataFrame.withColumnRenamed方法,但我只能重命名一个列,我有多个列连接,我只需要确保有一组唯一的列名,无论在数据帧表的别名,我申请的NA()填写()方法问题与DataFrame na()填充方法和模糊引用

下式给出:?

scala> val df1 = sqlContext.jsonFile("people.json").as("df1") 
df1: org.apache.spark.sql.DataFrame = [first: string, last: string] 

scala> val df2 = sqlContext.jsonFile("people.json").as("df2") 
df2: org.apache.spark.sql.DataFrame = [first: string, last: string] 

我可以加入他们一起与

val df3 = df1.join(df2, df1("first") === df2("first"), "left_outer") 

而且我有一个将数据类型转换为值的映射。

scala> val map = Map("df1.first"->"unknown", "df1.last" -> "unknown", 
"df2.first" -> "unknown", "df2.last" -> "unknown") 

但是执行fill(map)会导致异常。

scala> df3.na.fill(map) 

org.apache.spark.sql.AnalysisException: Reference 'first' is ambiguous, 
could be: first#6, first#8.; 
+0

我敢肯定,你可以只用值来替换值,例如, “Alberto” - >“unknown”,“Bruce” - >“unknown”,但不会将这些值作为DataFrame中的位置引用,这里是您应该看到的位置[DataFrameNaFunctions](http://spark.apache.org /docs/latest/api/scala/index.html#org.apache.spark.sql.DataFrameNaFunctions),此外我不知道你想要做什么,如果你想替换值或重命名列,你能更加详细一些? –

+0

我看到我的地图不需要df1引用,这可能会导致混淆。加入后,我想用df3中的“未知”替换可能存在的空值。 na.fill()方法接受一个列 - >值对的映射,def fill(valueMap:immutable.Map [String,Any]):DataFrame。 String字段引用列名称。 –

这是我想出来的。在我的原始示例中,加入后df2中没有任何有趣的内容,因此我将其更改为经典部门/员工示例。

department.json

{"department": 2, "name":"accounting"} 
{"department": 1, "name":"engineering"} 

person.json

{"department": 1, "first":"Bruce", "last": "szalwinski"} 

现在我可以加入dataframes,建立映射,并未知数替换空值。

scala> val df1 = sqlContext.jsonFile("department.json").as("df1") 
df1: org.apache.spark.sql.DataFrame = [department: bigint, name: string] 

scala> val df2 = sqlContext.jsonFile("people.json").as("df2") 
df2: org.apache.spark.sql.DataFrame = [department: bigint, first: string, last: string] 

scala> val df3 = df1.join(df2, df1("department") === df2("department"), "left_outer") 
df3: org.apache.spark.sql.DataFrame = [department: bigint, name: string, department: bigint, first: string, last: string] 

scala> val map = Map("first" -> "unknown", "last" -> "unknown") 
map: scala.collection.immutable.Map[String,String] = Map(first -> unknown, last -> unknown) 

scala> val df4 = df3.select("df1.department", "df2.first", "df2.last").na.fill(map) 
df4: org.apache.spark.sql.DataFrame = [department: bigint, first: string, last: string] 

scala> df4.show() 
+----------+-------+----------+ 
|department| first|  last| 
+----------+-------+----------+ 
|   2|unknown| unknown| 
|   1| Bruce|szalwinski| 
+----------+-------+----------+