[英]Pyspark / Dataframe: Add new column that keeps nested list as nested list
我有一個關於數據框的基本問題,並添加了一個應包含嵌套列表的列。 這基本上是問題所在:
b = [[['url.de'],['name']],[['url2.de'],['name2']]]
a = sc.parallelize(b)
a = a.map(lambda p: Row(URL=p[0],name=p[1]))
df = sqlContext.createDataFrame(a)
list1 = [[['a','s', 'o'],['hallo','ti']],[['a','s', 'o'],['hallo','ti']]]
c = [b[0] + [list1[0]],b[1] + [list1[1]]]
#Output looks like this:
[[['url.de'], ['name'], [['a', 's', 'o'], ['hallo', 'ti']]],
[['url2.de'], ['name2'], [['a', 's', 'o'], ['hallo', 'ti']]]]
要從此輸出創建一個新的數據框,我試圖創建一個新的架構:
schema = df.withColumn('NewColumn',array(lit("10"))).schema
然后,我用它來創建新的DataFrame:
df = sqlContext.createDataFrame(c,schema)
df.map(lambda x: x).collect()
#Output
[Row(URL=[u'url.de'], name=[u'name'], NewColumn=[u'[a, s, o]', u'[hallo, ti]']),
Row(URL=[u'url2.de'], name=[u'name2'], NewColumn=[u'[a, s, o]', u'[hallo, ti]'])]
現在的問題是,嵌套列表已轉換為具有兩個unicode條目的列表,而不是保留原始格式。
我認為這是由於我對新列“ ... array(lit(“ 10”))”的定義所致。
我必須使用什么才能保留原始格式?
您可以通過調用df.schema
直接檢查數據df.schema
的架構。 您可以看到,在給定方案中,我們具有以下內容:
StructType(
List(
StructField(URL,ArrayType(StringType,true),true),
StructField(name,ArrayType(StringType,true),true),
StructField(NewColumn,ArrayType(StringType,false),false)
)
)
您添加的NewColumn
是一個ArrayType
列,其條目均為StringType
。 因此,數組中包含的任何內容都將轉換為字符串,即使它本身就是數組。 如果要嵌套數組(2層),則需要更改架構,以使NewColumn
字段具有ArrayType(ArrayType(StringType,False),False)
NewColumn
ArrayType(ArrayType(StringType,False),False)
類型。 您可以通過顯式定義架構來做到這一點:
from pyspark.sql.types import StructType, StructField, ArrayType, StringType
schema = StructType([
StructField("URL", ArrayType(StringType(),True), True),
StructField("name", ArrayType(StringType(),True), True),
StructField("NewColumn", ArrayType(ArrayType(StringType(),False),False), False)])
或者通過嵌套array
函數array(array())
來定義NewColumn
來更改代碼:
df.withColumn('NewColumn',array(array(lit("10")))).schema
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.