Я читаю df
для запуска и собираюсь применить функцию для извлечения данных из столбца, который содержит list
из dicts
.
Когда я читаю файл и печатаю ихтипа, я получаю следующее.
dfCredits = spark.read.option("header","true").option("delimiter",";").csv(folder+'credits.csv',inferSchema =True).drop('_c0')
print(dfCredits.dtypes)
#[('cast', 'string'), ('crew', 'string'), ('id', 'string')]
Вот dfCredits:
+--------------------+--------------------+-----+
| cast| crew| id|
+--------------------+--------------------+-----+
|[{'cast_id': 14, ...|"[{'credit_id': '...| 862|
|[{'cast_id': 1, '...|[{'credit_id': '5...| 8844|
|[{'cast_id': 2, '...|[{'credit_id': '5...|15602|
|"[{'cast_id': 1, ...|[{'credit_id': '5...|31357|
|[{'cast_id': 1, '...|[{'credit_id': '5...|11862|
|"[{'cast_id': 25,...|"[{'credit_id': '...| 949|
|[{'cast_id': 1, '...|[{'credit_id': '5...|11860|
|[{'cast_id': 2, '...|[{'credit_id': '5...|45325|
|[{'cast_id': 1, '...|[{'credit_id': '5...| 9091|
|[{'cast_id': 1, '...|[{'credit_id': '5...| 710|
|"[{'cast_id': 1, ...|[{'credit_id': '5...| 9087|
Вот функция, которую я хочу применить:
def getDirector(x):
if type(x) == str:
x = eval(x)
for crew in x:
if crew.get('job') == 'Director':
return crew.get('name')
return None
Затем я создаюudf
getDirUDF = udf(lambda x: getDirector(x),StringType())
и применить функцию.
dfCredits.select('id','cast',getDirUDF('cast').alias('director'))
Я получаю следующую ошибку:
AttributeError: 'str' object has no attribute 'get'
Казалось, что это из-за попыткиоднако, если я добавляю исключение, все они попадают в исключение.
Кроме того, когда я пытаюсь проверить тип отдельных элементов столбцаЯ получаю следующее:
getDirUDF = udf(lambda x: type(x))
dfCredits.select('id','cast',getDirUDF('cast').alias('typeCast'))
+-----+--------------------+--------------------+
| id| cast| typeCast|
+-----+--------------------+--------------------+
| 862|[{'cast_id': 14, ...|net.razorvine.pic...|
| 8844|[{'cast_id': 1, '...|net.razorvine.pic...|
|15602|[{'cast_id': 2, '...|net.razorvine.pic...|
|31357|"[{'cast_id': 1, ...|net.razorvine.pic...|
|11862|[{'cast_id': 1, '...|net.razorvine.pic...|
| 949|"[{'cast_id': 25,...|net.razorvine.pic...|
Мне интересно, что такое net.razorvine.pickle.objects.classdictconstructor
(полное имя) и как я могу этим манипулировать.