私は持っている:
key value
a [1,2,3]
b [2,3,4]
欲しい:
key value1 value2 value3
a 1 2 3
b 2 3 4
scala では次のように書けるようですdf.select($"value._1", $"value._2", $"value._3")
が、python ではそれは不可能です。
では、これを行う良い方法はあるのでしょうか?
ベストアンサー1
「リスト」の種類によって異なります:
タイプが の場合
ArrayType()
:df = hc.createDataFrame(sc.parallelize([['a', [1,2,3]], ['b', [2,3,4]]]), ["key", "value"]) df.printSchema() df.show() root |-- key: string (nullable = true) |-- value: array (nullable = true) | |-- element: long (containsNull = true)
次のようにして、Python と同じように値にアクセスできます
[]
。df.select("key", df.value[0], df.value[1], df.value[2]).show() +---+--------+--------+--------+ |key|value[0]|value[1]|value[2]| +---+--------+--------+--------+ | a| 1| 2| 3| | b| 2| 3| 4| +---+--------+--------+--------+ +---+-------+ |key| value| +---+-------+ | a|[1,2,3]| | b|[2,3,4]| +---+-------+
タイプが
StructType()
: の場合 (JSON を読み取ってデータフレームを構築した可能性があります)df2 = df.select("key", psf.struct( df.value[0].alias("value1"), df.value[1].alias("value2"), df.value[2].alias("value3") ).alias("value")) df2.printSchema() df2.show() root |-- key: string (nullable = true) |-- value: struct (nullable = false) | |-- value1: long (nullable = true) | |-- value2: long (nullable = true) | |-- value3: long (nullable = true) +---+-------+ |key| value| +---+-------+ | a|[1,2,3]| | b|[2,3,4]| +---+-------+
次のようにして列を直接「分割」することができます
*
:df2.select('key', 'value.*').show() +---+------+------+------+ |key|value1|value2|value3| +---+------+------+------+ | a| 1| 2| 3| | b| 2| 3| 4| +---+------+------+------+