Как я могу разделить переменную и отобразить в определенном формате в pyspark с sparksql или фреймами данных? - PullRequest
0 голосов
/ 23 декабря 2018

Например, набор данных, это файл csv-

Name       ,  Country,  Income
Alan Turing,  UK,       1000
James Clark,  US,       5000

Я хотел бы выполнить некоторые преобразования для страны и дохода, но отобразить имя как

Имя
A Тьюринг
J Кларк

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018
from pyspark.sql.functions import split,concat,lit
myValues = [('Alan Turing','UK',1000),('James Clark','US',5000)]
df = sqlContext.createDataFrame(myValues,['Name','Country','Income'])
df.show()
+-----------+-------+------+
|       Name|Country|Income|
+-----------+-------+------+
|Alan Turing|     UK|  1000|
|James Clark|     US|  5000|
+-----------+-------+------+
df = df.withColumn('Name', concat(split(df['Name'], ' ')[0].substr(0,1), lit(' '), split(df['Name'], ' ')[1]))
df.show()
+--------+-------+------+
|    Name|Country|Income|
+--------+-------+------+
|A Turing|     UK|  1000|
| J Clark|     US|  5000|
+--------+-------+------+

Приведенный выше код не будет работать, если имя Alan Turing Müller.Следующий код более надежен -

from pyspark.sql.functions import concat, instr, length
myValues = [('Alan Turing Müller','UK',1000),('James Clark','US',5000)]
df = sqlContext.createDataFrame(myValues,['Name','Country','Income'])
df.show()
+------------------+-------+------+
|              Name|Country|Income|
+------------------+-------+------+
|Alan Turing Müller|     UK|  1000|
|       James Clark|     US|  5000|
+------------------+-------+------+
df = df.withColumn('Name', concat(df['Name'].substr(0,1),df['Name'].substr(instr(df['Name'],' '),length(df['Name'])-instr(df['Name'],' ')+1)))
df.show()
+---------------+-------+------+
|           Name|Country|Income|
+---------------+-------+------+
|A Turing Müller|     UK|  1000|
|        J Clark|     US|  5000|
+---------------+-------+------+
0 голосов
/ 23 декабря 2018

Поскольку вы пометили вопрос с помощью Python и спросили о фреймах данных, вы можете использовать метод pandas replace :

import pandas as pd


data = [['Alan Turing',  'UK',       1000],
['James Clark',  'US',       5000]]


df = pd.DataFrame(data=data, columns=['Name', 'Country', 'Income'])
df['Name'] = df.Name.str.replace('(\w)\w* (\w+)', r'\1 \2', regex=True)

print(df)

Вывод

Name Country  Income
0  A Turing      UK    1000
1   J Clark      US    5000

Шаблон (\w)\w* (\w+) - это регулярное выражение, которое фиксирует первую букву имени и (целое) фамилию.Затем он заменяет строку первой буквой имени и фамилией r'\1 \2'.

...