如何在pyspark的方括号内提取列值?

时间:2018-08-31 18:53:41

标签: python pyspark

我有一个类似这样的数据框

+---+---------+--------------------+
| id|     name|               actor|
+---+---------+--------------------+
|  0|    [123]|                 tom|
|  1|    [321]|                brad|
+---+---------+--------------------+

仅供参考。 '名称'-StringType()

但是我想得到这样的东西

+---+---------+--------------------+
| id|     name|               actor|
+---+---------+--------------------+
|  0|      123|                 tom|
|  1|      321|                brad|
+---+---------+--------------------+

我正在尝试提取方括号之间的值并将其转换为IntegerType。我尝试使用带有正则表达式的 split 函数。但是,它不起作用。

3 个答案:

答案 0 :(得分:0)

我认为您可以尝试以下方法。如果 df 是您指定的数据框名称

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="long">

答案 1 :(得分:0)

您可以做这样的事情, 请确保我没有更改最终DF的架构,因此它仍将充当字符串。如果你想。您将不得不更改schema

from pyspark.sql.types import StructType, StringType, StructField

data=sc.parallelize([
    [0, [123], "tom"],
    [1, [123], "brad"]
])


schema = StructType([
    StructField("id", StringType(), True),
    StructField("name", StringType(), True),
    StructField("count", StringType(), True)
    ])
DF = sqlContext.createDataFrame(data, schema)
DF.show()
+---+-----+-----+
| id| name|count|
+---+-----+-----+
|  0|[123]|  tom|
|  1|[123]| brad|
+---+-----+-----+

x = data.map(lambda x: [x[0],int(x[1][0]), x[2]]).toDF(schema)
x.show()
+---+----+-----+
| id|name|count|
+---+----+-----+
|  0| 123|  tom|
|  1| 123| brad|
+---+----+-----+

答案 2 :(得分:0)

您可以使用explode来解构数组:

import pyspark
from pyspark.sql import SparkSession
from pyspark import SparkContext
import pandas as pd
from pyspark.sql import functions as F
from pyspark.sql import Window

sc = SparkContext.getOrCreate()
spark = SparkSession(sc)

columns = ['id', 'name', 'actor']
data = [(0, [123], 'tom'), (1, [321], 'brad')]

df = spark.createDataFrame(data, columns)

exploded = df.withColumn('name', F.explode('name'))
exploded.show()

+---+----+-----+
| id|name|actor|
+---+----+-----+
|  0| 123|  tom|
|  1| 321| brad|
+---+----+-----+

通过检查类型,您可以看到它实际上是包含的类型:

exploded.dtypes

[('id', 'bigint'), ('name', 'bigint'), ('actor', 'string')]