2016-05-12 71 views
0

我有以下數據框(內部數組的值是字符串):星火Dataframes:在新的一列追加列表(蟒蛇)

+--------------------+--------------------+ 
|    col1|    col2| 
+--------------------+--------------------+ 
| [value1, value2]|  [value3,value4]| 
|   [value5]|   [value6]| 
+--------------------+--------------------+ 

如何創建一個新的陣列,包括一個新列的所有雙方

+--------------------+--------------------+------------------------------+ 
|    col1|    col2|       new | 
+--------------------+--------------------+------------------------------+ 
| [value1, value2]|  [value3,value4]|[value1, value2,value3,value4]| 
|   [value5]|   [value6]|    [value5,value6]| 
+--------------------+--------------------+------------------------------+ 

值我試過如下:

def add_function(col1,col2): 
    return col1+col2 

udf_add = udf(add_function,ArrayType(StringType())) 
dftrial.withColumn("new",udf_add("col1","col2")).show(2) 

根據需要它做任務。但我不明白爲什麼當我修改add_function到:

def add_function(col1,col2): 
    return col1.extend(col2) 

它返回null值。爲什麼?

而我的主要問題:是否有另一種方式來實現這個任務,任何已經實現的功能?我發現concat,但它似乎只適用於字符串。

回答

1

爲什麼不呢?使用Python類型提示list.extend是:

list.extend(iterable) -> None 

所以,你得到什麼從extend返回。如果你想返回修改集合,你實際上應該返回col1,但請不要因爲這裏實際上有更糟糕的部分。

你應該從來沒有在使用Spark時修改數據。雖然在這種特殊情況下你很安全,但可能會產生不可預測的後果。你可以在我對Will there be any scenario, where Spark RDD's fail to satisfy immutability.?的回答中找到可能的例子。儘管PySpark與這種行爲相對絕對,但它只是一個實現細節,並不是一般你可以依賴的東西。

+0

感謝您的回答。你能澄清我永遠不應該做的事嗎?因爲我完全不理解它,它似乎是我失蹤的重要信息。 –

+1

'list.extend'修改(改變)現有的'list'。不要對你的數據做這件事。總是返回一個新的對象,除非明確地允許做另外的事情(參見'RDD.fold','RDD.aggregate'等) – zero323

0

我同意@ zero323。我只是想添加在新數據框中獲得解決方案所需的轉換。

val updatedDataframe = initialDataframe.map { 
    case Row(col1: Seq[String], col2: Seq[String]) => (col1, col2, col1.union(col2)) 
    }.toDF("col1", "col2", "col3")