Как извлечь значение столбца в квадратных скобках в pyspark? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть датафрейм, примерно такой

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

FYI. 'name' - StringType ()

Но я бы хотел получить что-то вроде этого

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

Я пытаюсь извлечь значения между квадратными скобками и привести их к IntegerType. Я попытался использовать функцию split с регулярным выражением. Но это не работает.

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

вы можете сделать что-то вроде этого, Пожалуйста, убедитесь, что я не изменяю схему для окончательного 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|
+---+----+-----+
0 голосов
/ 31 августа 2018

Вы можете использовать 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')]
0 голосов
/ 31 августа 2018

Я думаю, вы можете попробовать следующее. Если df - это ваше заданное имя кадра данных

df.select(df.name.cast("string").alias('name')).collect()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...