我正在嘗試將串列轉換為 pyspark 中的資料幀,以便我可以將其作為列連接到更大的資料幀中。串列中的資料是隨機生成的名稱,如下所示:
from faker import Faker
from pyspark.sql.functions import *
import pyspark.sql.functions as F
from pyspark.sql.types import *
faker = Faker("en_GB")
list1 = [faker.first_name() for _ in range(0, 100)]
firstname = sc.parallelize([list1])
schema = StructType([
StructField('FirstName', StringType(), True)
])
df = spark.createDataFrame(firstname, schema)
display(df)
但我收到此錯誤:
PythonException:'ValueError:物件長度 (100) 與欄位長度 (1) 不匹配'。
關于導致此問題的原因以及如何解決它的任何想法表示贊賞!
非常感謝,
卡羅萊納州
uj5u.com熱心網友回復:
您得到的是一個,ValueError因為您將一個包含一個包含 100 個名稱parallelize的串列的元素的串列傳遞給,而不是傳遞一個包含 100 個元素的串列,每個元素都包含一個包含一個名稱的串列。
例如,如果Faker.first_name()回傳'John',則'Henry',則'Jade',等等...,您的[list1]引數包含[['John', 'Henry', 'Jade', ...]].
當您將此類串列傳遞給createDataFrame方法時,它會嘗試創建一個具有 100 列的一行的資料框。由于您的架構僅定義了一列,因此它失敗了。
這里解決方法是直接從資料幀創建list1作為PApostol的答案,或更改你如何建立list1讓你有一個包含每個名稱,而不是100個名字的一個串列清單的100名名單串列:
from faker import Faker
from pyspark.sql.functions import *
import pyspark.sql.functions as F
from pyspark.sql.types import *
faker = Faker("en_GB")
list1 = [[faker.first_name()] for _ in range(0, 100)]
firstname = sc.parallelize(list1)
schema = StructType([
StructField('FirstName', StringType(), True)
])
df = spark.createDataFrame(firstname, schema)
display(df)
uj5u.com熱心網友回復:
這可能是因為pyspark嘗試創建一個包含 100 列(長度為firstname)的資料框,但您僅在schema. 嘗試不并行化:
list1 = [faker.first_name() for _ in range(0, 100)]
df = spark.createDataFrame(list1, schema)
或者,如果您確實想要并行化,請嘗試:
from pyspark.sql import Row
list1 = [faker.first_name() for _ in range(0, 100)]
firstname = sc.parallelize([list1])
firstname_row = firstname.map(lambda x: Row(x))
df = spark.createDataFrame(firstname_row, schema)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/365959.html
上一篇:Hive,如何洗掉磁區,編譯陳述句時出錯:失敗:期望在洗掉磁區陳述句中設定為空
下一篇:在PysPark中合并重疊區間
