PySpark - разбить строковый столбец и соединить часть из них, чтобы сформировать новые столбцы - PullRequest
0 голосов
/ 08 мая 2018

У меня есть датафрейм в следующем формате:

id    text
1     Amy How are you today? Smile
2     Sam Not very well. Sad

Я хочу создать новый кадр следующего формата:

id    Name    Content              Expression
1     Amy     How are you today?   Smile
2     Sam     Not very well.       Sad

Для этого я планирую сначала разбить текстовый столбец:

cols = F.split(df['text'], ' ')
df = df.withColumn('Name', cols.getItem(0))

Но как мне получить контент и выражение? Могу ли я использовать cols.getItem(-1), чтобы получить последний элемент текста? И как мне объединить cols [1: -1] (от второго элемента к последнему второму элементу) в cols, чтобы сформировать новый столбец content?


Я исследую данные, на самом деле двойные кавычки с предложением не гарантированы. Единственное, на что можно положиться - это разделение пространства.

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Может быть, проще сделать UDF для этого. Но вы также можете справиться с этим с помощью Spark функций .

df\
    .withColumn("Name", split(col("text"), " ").getItem(0))\
    .withColumn("Content", regexp_extract(col("text"), "[a-zA-Z0-9]+ (.*) [a-zA-Z0-9]+", 1)) \
    .withColumn("Expression", reverse(split(reverse(col("text")), " ").getItem(0))) \
    .show()


.+---+--------------------+----+------------------+----------+
| id|                text|Name|           Content|Expression|
+---+--------------------+----+------------------+----------+
|  1|Amy How are you t...| Amy|How are you today?|     Smile|
|  2|Sam Not very well...| Sam|    Not very well.|       Sad|
+---+--------------------+----+------------------+----------+
0 голосов
/ 08 мая 2018

Заданный ввод фрейм данных со схемой

+---+----------------------------+
|id |text                        |
+---+----------------------------+
|1  |Amy How are you today? Smile|
|2  |Sam Not very well. Sad      |
+---+----------------------------+
root
 |-- id: long (nullable = true)
 |-- text: string (nullable = true)

Вы можете просто использовать следующую функцию udf, чтобы выполнить ваше требование

from pyspark.sql import functions as f
from pyspark.sql import types as t

@f.udf(t.StructType([t.StructField("Name", t.StringType(), True), t.StructField("Content", t.StringType(), True), t.StructField("Expression", t.StringType(), True)]))
def splitCols(array):
    return (array[0], ' '.join(array[1:len(array)-1]), array[len(array)-1])

df.withColumn('text', splitCols(f.split('text', ' ')))\
    .select(f.col('id'), f.col('text.*'))\
    .show(truncate=False)

, который должен дать вам

+---+----+------------------+----------+
|id |Name|Content           |Expression|
+---+----+------------------+----------+
|1  |Amy |How are you today?|Smile     |
|2  |Sam |Not very well.    |Sad       |
+---+----+------------------+----------+
0 голосов
/ 08 мая 2018
spltText = udf(lambda data:[ele.strip() for ele in data.split('"')], ArrayType(StringType()))
spltDF = df.withColumn("spltData",spltText(df.text))
spltDF = (spltDF.withColumn('Name', spltDF.spltData.getItem(0))
                .withColumn('Content', spltDF.spltData.getItem(1))
                .withColumn('Expression', spltDF.spltData.getItem(2)))
spltDF.select('id','Name','Content','Expression').show()

+---+----+------------------+----------+
| id|Name|           Content|Expression|
+---+----+------------------+----------+
|  1| Amy|How are you today?|   (Smile)|
|  2| Sam|    Not very well.|     (Sad)|
+---+----+------------------+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...