我有一個這樣的資料框
--- ---------------------
| id| csv|
--- ---------------------
| 1|a,b,c\n1,2,3\n2,3,4\n|
| 2|a,b,c\n3,4,5\n4,5,6\n|
| 3|a,b,c\n5,6,7\n6,7,8\n|
--- ---------------------
而我想爆出字串型別的csv欄目,其實我只對這個欄目感興趣。所以我正在尋找一種從上面獲取以下資料幀的方法。
-- -- --
| a| b| c|
-- -- --
| 1| 2| 3|
| 2| 3| 4|
| 3| 4| 5|
| 4| 5| 6|
| 5| 6| 7|
| 6| 7| 8|
-- -- --
查看from_csv 檔案,似乎輸入 csv 字串只能包含一行資料,我發現這里說得更清楚。所以這不是一個選擇。
我想我可以遍歷輸入資料幀的各個行,從每一行中提取并決議 csv 字串,然后將所有內容拼接在一起:
rows = df.collect()
for (i, row) in enumerate(rows):
data = row['csv']
data = data.split('\\n')
rdd = spark.sparkContext.parallelize(data)
df_row = (spark.read
.option('header', 'true')
.schema('a int, b int, c int')
.csv(rdd))
if i == 0:
df_new = df_row
else:
df_new = df_new.union(df_row)
df_new.show()
但這似乎非常低效。有沒有更好的方法來達到預期的結果?
uj5u.com熱心網友回復:
與您一起使用split from_csv函式可以執行以下操作:transform
from pyspark.sql import functions as F
df = spark.createDataFrame([
(1, r"a,b,c\n1,2,3\n2,3,4\n"), (2, r"a,b,c\n3,4,5\n4,5,6\n"),
(3, r"a,b,c\n5,6,7\n6,7,8\n")], ["id", "csv"]
)
df1 = df.withColumn(
"csv",
F.transform(
F.split(F.regexp_replace("csv", r"^a,b,c\\n|\\n$", ""), r"\\n"),
lambda x: F.from_csv(x, "a int, b int, c int")
)
).selectExpr("inline(csv)")
df1.show()
# --- --- ---
# | a| b| c|
# --- --- ---
# | 1| 2| 3|
# | 2| 3| 4|
# | 3| 4| 5|
# | 4| 5| 6|
# | 5| 6| 7|
# | 6| 7| 8|
# --- --- ---
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/524051.html
標籤:PythonCSV阿帕奇火花pysparkapache-spark-sql
上一篇:將Maven專案宣告為測驗專案
