簡體   English   中英

Pyspark / Dataframe:添加新列,將嵌套列表保留為嵌套列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM