第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Pyspark:將多個(gè)數(shù)組列拆分為行

Pyspark:將多個(gè)數(shù)組列拆分為行

動(dòng)漫人物 2019-12-18 16:04:56
我有一個(gè)具有一行和幾列的數(shù)據(jù)框。一些列是單個(gè)值,另一些是列表。所有列表列的長(zhǎng)度均相同。我想將每個(gè)列表列拆分為單獨(dú)的行,同時(shí)將任何非列表列保持原樣。樣本DF:from pyspark import Rowfrom pyspark.sql import SQLContextfrom pyspark.sql.functions import explodesqlc = SQLContext(sc)df = sqlc.createDataFrame([Row(a=1, b=[1,2,3],c=[7,8,9], d='foo')])# +---+---------+---------+---+# |  a|        b|        c|  d|# +---+---------+---------+---+# |  1|[1, 2, 3]|[7, 8, 9]|foo|# +---+---------+---------+---+我想要的是:+---+---+----+------+|  a|  b|  c |    d |+---+---+----+------+|  1|  1|  7 |  foo ||  1|  2|  8 |  foo ||  1|  3|  9 |  foo |+---+---+----+------+如果我只有一個(gè)列表列,只需執(zhí)行以下操作即可輕松實(shí)現(xiàn)explode:df_exploded = df.withColumn('b', explode('b'))# >>> df_exploded.show()# +---+---+---------+---+# |  a|  b|        c|  d|# +---+---+---------+---+# |  1|  1|[7, 8, 9]|foo|# |  1|  2|[7, 8, 9]|foo|# |  1|  3|[7, 8, 9]|foo|# +---+---+---------+---+但是,如果我也嘗試使用explode該c列,則會(huì)得到一個(gè)長(zhǎng)度為我想要的平方的數(shù)據(jù)框:df_exploded_again = df_exploded.withColumn('c', explode('c'))# >>> df_exploded_again.show()# +---+---+---+---+# |  a|  b|  c|  d|# +---+---+---+---+# |  1|  1|  7|foo|# |  1|  1|  8|foo|# |  1|  1|  9|foo|# |  1|  2|  7|foo|# |  1|  2|  8|foo|# |  1|  2|  9|foo|# |  1|  3|  7|foo|# |  1|  3|  8|foo|# |  1|  3|  9|foo|# +---+---+---+---+我想要的是-對(duì)于每一列,采用該列中數(shù)組的第n個(gè)元素,并將其添加到新行中。我嘗試過在數(shù)據(jù)框中的所有列之間映射爆炸,但是這似乎也不起作用:df_split = df.rdd.map(lambda col: df.withColumn(col, explode(col))).toDF()
查看完整描述

3 回答

?
慕的地10843

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊

您需要使用flatMap,而不是map要在每個(gè)輸入行中創(chuàng)建多個(gè)輸出行。


from pyspark.sql import Row

def dualExplode(r):

    rowDict = r.asDict()

    bList = rowDict.pop('b')

    cList = rowDict.pop('c')

    for b,c in zip(bList, cList):

        newDict = dict(rowDict)

        newDict['b'] = b

        newDict['c'] = c

        yield Row(**newDict)


df_split = sqlContext.createDataFrame(df.rdd.flatMap(dualExplode))


查看完整回答
反對(duì) 回復(fù) 2019-12-18
?
FFIVE

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊

zip將obj的第一個(gè)元素與另一個(gè)對(duì)象的第一個(gè)元素,第2個(gè)和第2個(gè)元素等配對(duì)在一起,直到其中一個(gè)對(duì)象用完元素。您的情況是2個(gè)值之后。換句話說,它將配對(duì)元素,直到?jīng)]有更多要配對(duì)的項(xiàng)目為止。要提出任何建議,我需要知道您希望程序如何處理未配對(duì)的元素(例如,您是否要從第二組中獲取空值?)。同樣,在此示例中只有1 df。如果你的問題是從這一不同,它可能會(huì)更好,只是問了另一個(gè)問題

查看完整回答
反對(duì) 回復(fù) 2019-12-18
  • 3 回答
  • 0 關(guān)注
  • 1384 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)