【问题标题】:pyspark dataframe from rdd containing key and values as list of lists来自rdd的pyspark数据框包含键和值作为列表列表
【发布时间】:2017-03-31 21:12:15
【问题描述】:

我有一个如下所示的 RDD,其中键和值作为包含一些参数的列表列表。

(32719, [[[u'200.73.55.34', u'192.16.48.217', 0, 6, 10163, 443, 0], [u'177.207.76.243', u'192.16.58.8', 0, 6, 59575, 80, 0]])
(32897, [[[u'200.73.55.34', u'193.16.48.217', 0, 6, 10163, 443, 0], [u'167.207.76.243', u'194.16.58.8', 0, 6, 59575, 80, 0]])

我想创建一个具有如下行和列的数据框

32719, '200.73.55.34', u'192.16.48.217', 0, 6, 10163, 443, 0
32719, '177.207.76.243', u'192.16.58.8', 0, 6, 59575, 80, 0
32897, 200.73.55.34', u'193.16.48.217', 0, 6, 10163, 443, 0

或者只是一个包含所有值但按键分组的数据框。我该怎么做。

【问题讨论】:

    标签: apache-spark pyspark spark-dataframe rdd


    【解决方案1】:

    使用平面地图值

    a =[(32719, [[[u'200.73.55.34', u'192.16.48.217', 0, 6, 10163, 443, 0], [u'177.207.76.243', u'192.16.58.8', 0, 6, 59575, 80, 0]]]),
    (32897, [[[u'200.73.55.34', u'193.16.48.217', 0, 6, 10163, 443, 0], [u'167.207.76.243', u'194.16.58.8', 0, 6, 59575, 80, 0]]])]
    
    rdd =sc.parallelize(a)
    
    rdd.flatMapValues(lambda x:x[0]).map(lambda x: [x[0]]+x[1]).toDF().show()
    

    输出

    +-------+----------------+---------------+----+----+-------+-----+----+
    |  _1   |       _2       |      _3       | _4 | _5 |  _6   | _7  | _8 |
    +-------+----------------+---------------+----+----+-------+-----+----+
    | 32719 | 200.73.55.34   | 192.16.48.217 |  0 |  6 | 10163 | 443 |  0 |
    | 32719 | 177.207.76.243 | 192.16.58.8   |  0 |  6 | 59575 |  80 |  0 |
    | 32897 | 200.73.55.34   | 193.16.48.217 |  0 |  6 | 10163 | 443 |  0 |
    | 32897 | 167.207.76.243 | 194.16.58.8   |  0 |  6 | 59575 |  80 |  0 |
    +-------+----------------+---------------+----+----+-------+-----+----+
    

    【讨论】:

    • 谢谢。一个后续问题。如果我想通过将它们与第一列中的值分组来从此数据帧创建多个数据帧。如何做到这一点。
    • 你打算如何处理这些多个数据帧?
    • 根据第一列中的键,每个数据框将进入单独的表。
    【解决方案2】:

    您可以映射以将键添加到每个值并创建数据框。我尝试了我的方式,

    >>>dat1 = [(32719, [[u'200.73.55.34', u'192.16.48.217', 0, 6, 10163, 443, 0], [u'177.207.76.243', u'192.16.58.8', 0, 6, 59575, 80, 0]]),(32897, [[u'200.73.55.34', u'193.16.48.217', 0, 6, 10163, 443, 0], [u'167.207.76.243', u'194.16.58.8', 0, 6, 59575, 80, 0]])]
    
    >>>rdd1 = sc.parallelize(dat1).map(lambda x : [[x[0]]+i for i in x[1]]).flatMap(lambda x : (x))
    >>>df = rdd1.toDF(['col1','col2','col3','col4','col5','col6','col7','col8'])
    >>> df.show()
    +-----+--------------+-------------+----+----+-----+----+----+
    | col1|          col2|         col3|col4|col5| col6|col7|col8|
    +-----+--------------+-------------+----+----+-----+----+----+
    |32719|  200.73.55.34|192.16.48.217|   0|   6|10163| 443|   0|
    |32719|177.207.76.243|  192.16.58.8|   0|   6|59575|  80|   0|
    |32897|  200.73.55.34|193.16.48.217|   0|   6|10163| 443|   0|
    |32897|167.207.76.243|  194.16.58.8|   0|   6|59575|  80|   0|
    +-----+--------------+-------------+----+----+-----+----+----+
    

    【讨论】:

    • 检查您的输入数据和 OP 的数据。每个项目的方括号都有细微的差别。
    • 有问题的输入本身在括号中存在差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2022-01-17
    • 2020-06-27
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多