我有:
key value
a [1,2,3]
b [2,3,4]
我想要:
key value1 value2 value3
a 1 2 3
b 2 3 4
似乎在scala中我可以写:< code>df.select($"value。_1 ",$ "值。_2 ",$ "值。_3"),但这在python中是不可能的。
那么有没有好的办法呢?
我需要将712维数组取消列出到列中,以便将其写入csv。我首先使用@MaFF的解决方案来解决我的问题,但这似乎会导致很多错误和额外的计算时间。我不确定是什么原因造成的,但我使用了一种不同的方法,大大减少了计算时间(22分钟与超过4小时相比)!
@MaFF的方法:
length = len(dataset.head()["list_col"])
dataset = dataset.select(dataset.columns + [dataset["list_col"][k] for k in range(length)])
我用的是:
dataset = dataset.rdd.map(lambda x: (*x, *x["list_col"])).toDF()
如果有人知道是什么导致了计算时间的差异,请告诉我!我怀疑在我的例子中,瓶颈在于调用<code>head()
我想将大小列表(数组)的情况添加到pault答案中。
如果我们的列包含中型数组(或大型数组),仍然可以将它们拆分为列。
from pyspark.sql.types import * # Needed to define DataFrame Schema.
from pyspark.sql.functions import expr
# Define schema to create DataFrame with an array typed column.
mySchema = StructType([StructField("V1", StringType(), True),
StructField("V2", ArrayType(IntegerType(),True))])
df = spark.createDataFrame([['A', [1, 2, 3, 4, 5, 6, 7]],
['B', [8, 7, 6, 5, 4, 3, 2]]], schema= mySchema)
# Split list into columns using 'expr()' in a comprehension list.
arr_size = 7
df = df.select(['V1', 'V2']+[expr('V2[' + str(x) + ']') for x in range(0, arr_size)])
# It is posible to define new column names.
new_colnames = ['V1', 'V2'] + ['val_' + str(i) for i in range(0, arr_size)]
df = df.toDF(*new_colnames)
结果是:
df.show(truncate= False)
+---+---------------------+-----+-----+-----+-----+-----+-----+-----+
|V1 |V2 |val_0|val_1|val_2|val_3|val_4|val_5|val_6|
+---+---------------------+-----+-----+-----+-----+-----+-----+-----+
|A |[1, 2, 3, 4, 5, 6, 7]|1 |2 |3 |4 |5 |6 |7 |
|B |[8, 7, 6, 5, 4, 3, 2]|8 |7 |6 |5 |4 |3 |2 |
+---+---------------------+-----+-----+-----+-----+-----+-----+-----+
这取决于您的“列表”的类型:
>
如果它是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]|
+---+-------+
如果它是结构类型()
类型:(也许您通过读取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]|
+---+-------+
您可以使用< code>*直接“拆分”列:
df2.select('key', 'value.*').show()
+---+------+------+------+
|key|value1|value2|value3|
+---+------+------+------+
| a| 1| 2| 3|
| b| 2| 3| 4|
+---+------+------+------+
我有一个火花数据框如下,并希望分裂成3的空间列。 下面是预期的结果。第一项留在text1列,第二项转到text2,其余的都转到text3(如果有)。原始列值可能包含空记录或带有任意数量分隔符的值,分隔符是空格。 提前感谢!
我有一个数据框架,它有一行和几列。有些列是单个值,有些是列表。所有列表列的长度相同。我想将每个列表列拆分为单独的行,同时保留任何非列表列。 样本DF: 我想要什么: 如果我只有一个列表列,那么只需执行< code>explode就很容易了: 然而,如果我尝试分解<code>c</code>列,我得到的数据帧长度为我想要的平方: 我想要的是-对于每一列,取该列中数组的第n个元素,并将其添加到新行。我
如何将这列列表拆分为两列? 期望的结果:
本文向大家介绍如何在R中将字符串列拆分为多列?,包括了如何在R中将字符串列拆分为多列?的使用技巧和注意事项,需要的朋友参考一下 这可以在tidyr软件包的帮助下完成。 示例
我正在Spark 3.0.0上执行Spark结构流的示例,为此,我使用了twitter数据。我在Kafka中推送了twitter数据,单个记录如下所示 2020-07-21 10:48:19|1265200268284588034|RT@narendramodi:与@IBM首席执行官@ArvindKrishna先生进行了广泛的互动。我们讨论了几个与技术相关的主题,…|印度海得拉巴 在这里,每个字段
我的问题是如何将一列拆分为多个列。我不知道为什么 不起作用。 例如,我想将“df_test”更改为“df_test2”。我看到了很多使用熊猫模块的例子。还有别的办法吗?提前感谢您。 df_test2