Rag*_*pta 4 python apache-spark apache-spark-sql pyspark
我有一个名为“new_emp_final_1”的数据框。当我尝试从 CookTime 和 prepTime 派生列“难度”时,通过从 udf 调用函数难度,它给了我错误。
new_emp_final_1.dtypes 如下 -
[('name', 'string'), ('ingredients', 'string'), ('url', 'string'), ('image', 'string'), ('cookTime', 'string'), ('recipeYield', 'string'), ('datePublished', 'strin
g'), ('prepTime', 'string'), ('description', 'string')]
Run Code Online (Sandbox Code Playgroud)
new_emp_final_1.schema 的结果是 -
StructType(List(StructField(name,StringType,true),StructField(ingredients,StringType,true),StructField(url,StringType,true),StructField(image,StringType,true),StructField(cookTime,StringType,true),StructField(recipeYield,StringType,true),StructField(datePublished,StringType,true),StructField(prepTime,StringType,true),StructField(description,StringType,true)))
Run Code Online (Sandbox Code Playgroud)
代码:
def difficulty(cookTime, prepTime):
if not cookTime or not prepTime:
return "Unkown"
total_duration = cookTime + prepTime
if total_duration > 3600:
return "Hard"
elif total_duration > 1800 and total_duration < 3600:
return "Medium"
elif total_duration < 1800:
return "Easy"
else:
return "Unkown"
func_udf = udf(difficulty, IntegerType())
new_emp_final_1 = new_emp_final_1.withColumn("difficulty", func_udf(new_emp_final_1.cookTime, new_emp_final_1.prepTime))
new_emp_final_1.show(20,False)
Run Code Online (Sandbox Code Playgroud)
错误是-
File "/home/raghavcomp32915/mypycode.py", line 56, in <module>
func_udf = udf(difficulty, IntegerType())
File "/usr/hdp/current/spark2-client/python/lib/pyspark.zip/pyspark/sql/udf.py", line 186, in wrapper
File "/usr/hdp/current/spark2-client/python/lib/pyspark.zip/pyspark/sql/udf.py", line 166, in __call__
File "/usr/hdp/current/spark2-client/python/lib/pyspark.zip/pyspark/sql/column.py", line 66, in _to_seq
File "/usr/hdp/current/spark2-client/python/lib/pyspark.zip/pyspark/sql/column.py", line 54, in _to_java_column
TypeError: Invalid argument, not a string or column: <function difficulty at 0x7f707e9750c8> of type <type 'function'>. For column literals, use 'lit', 'array', 's
truct' or 'create_map' function.
我期望现有数据帧 new_emp_final_1 中有一个名为“difficulty”的列,其值为“Hard”、“Medium”、“Easy”或“Unknown”。
Ski*_*rou 17
我在使用 Python\xe2\x80\x99s 时遇到了这个问题sum,因为与 Spark\xe2\x80\x99s SQL \xe2\x80\x94 存在冲突,这是sum为什么这个\xe2\x80\xaf 的现实说明:
from pyspark.sql.functions import *\nRun Code Online (Sandbox Code Playgroud)\n不好。
\n不言而喻,解决方案是要么限制导入所需的函数,要么导入pyspark.sql.functions所需的函数并为其添加前缀。
通过研究 udf(难度),我看到了两件事:
这个例子对我有用:
from pyspark.sql.types import StringType, StructType, StructField, IntegerType
import pandas as pd
schema = StructType([StructField("name", StringType(), True),
StructField('ingredients',StringType(),True),
StructField('url',StringType(),True),
StructField('image',StringType(),True),
StructField('cookTime',StringType(),True),
StructField('recipeYield',StringType(),True),
StructField('datePublished',StringType(),True),
StructField('prepTime',StringType(),True),
StructField('description',StringType(),True)])
data = {
"name": ['meal1', 'meal2'],
"ingredients": ['ingredient11, ingredient12','ingredient21, ingredient22'],
"url": ['URL1', 'URL2'],
"image": ['Image1', 'Image2'],
"cookTime": ['60', '3601'],
"recipeYield": ['recipeYield1', 'recipeYield2'],
"prepTime": ['0','3000'],
"description": ['desc1','desc2']
}
new_emp_final_1_pd = pd.DataFrame(data=data)
new_emp_final_1 = spark.createDataFrame(new_emp_final_1_pd)
def difficulty(cookTime, prepTime):
if not cookTime or not prepTime:
return "Unkown"
total_duration = int(cookTime) + int(prepTime)
if total_duration > 3600:
return "Hard"
elif total_duration > 1800 and total_duration < 3600:
return "Medium"
elif total_duration < 1800:
return "Easy"
else:
return "Unkown"
func_udf = udf(difficulty, StringType())
new_emp_final_1 = new_emp_final_1.withColumn("difficulty",
func_udf(new_emp_final_1.cookTime, new_emp_final_1.prepTime))
new_emp_final_1.show(20,False)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33242 次 |
| 最近记录: |