[英]Convert String to Separate Rows and then to Pyspark Dataframe
我有一个这样的字符串,每一行都用 \n 分隔。
我尝试了多种方法,但找不到任何合适的方法。
列名 \n 第一行 \n 第二行 例如
"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
你可以试试这个
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|
# +----+---+------+
我假设您正在尝试从单个文本创建。 如果是这样,有很多方法可以从 pyspark 中的列表创建 dataframe - 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|
+----+---+------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.