Преобразование строки в отдельные строки, а затем в фрейм данных Pyspark - PullRequest
0 голосов
/ 12 июля 2020

У меня есть такая строка, и каждая строка разделена \ n.

Я пробовал несколько способов, но не смог найти подходящий способ.

Имена столбцов \ n 1-я строка \ n 2-я строка Например,

"Name,ID,Number\n abc,1,123 \n xyz,2,456"

I want to convert it into pyspark dataframe like this

Name     ID   Number
abc      1      123
xyz      2      456

Ответы [ 2 ]

5 голосов
/ 12 июля 2020

Вы можете попробовать это

from pyspark.sql.functions import *
from pyspark.sql.types import *

data = spark.sql("""select 'Name,ID,Number\n abc,1,123 \n xyz,2,456' as col1""")

data.show(20,False)
# +-------------------------------------+
# |col1                                 |
# +-------------------------------------+
# |Name,ID,Number
#  abc,1,123 
#  xyz,2,456|
# +-------------------------------------+
data.createOrReplaceTempView("data")
data = spark.sql("""
select posexplode(split(col1,'\n'))
from data
""")
data.show(20,False)
# +---+--------------+
# |pos|col           |
# +---+--------------+
# |0  |Name,ID,Number|
# |1  | abc,1,123    |
# |2  | xyz,2,456    |
# +---+--------------+

columnList = data.select('col').first()[0].split(",")
data.createOrReplaceTempView("data")

query = ""
for i,e in enumerate(columnList):
  query += "trim(split(col , ',')[{1}]) as {0}".format(e,i) if i == 0 else ",trim(split(col , ',')[{1}]) as {0}".format(e,i)

finalData = spark.sql("""
SELECT {0}
FROM data
where pos > 0
""".format(query))
finalData.show()

# +----+---+------+
# |Name| ID|Number|
# +----+---+------+
# | abc|  1|   123|
# | xyz|  2|   456|
# +----+---+------+
1 голос
/ 12 июля 2020

Я предполагаю, что вы пытаетесь создать из одного текста. Если это так, существует множество методов для создания фрейма данных из списков в pyspark - createDataFrame (), до DF () и распараллеливания. В python есть много способов разбить строку на списки. Так что объединение этих двух вещей должно дать вам желаемый результат. Пожалуйста, исследуйте их. Один из возможных методов ниже:

tst_str= "Name,ID,Number\n abc,1,123 \n xyz,2,456"
tst_spl = [x.split(',') for x in tst_str.split()]
#%%
tst_df = sqlContext.createDataFrame(tst_spl[1:],schema=tst_spl[0])

tst_df.show()
+----+---+------+
|Name| ID|Number|
+----+---+------+
| abc|  1|   123|
| xyz|  2|   456|
+----+---+------+
...