Я пытаюсь сделать UDF в pyspark для округления одного столбца с точностью, указанной в каждой строке другим столбцом, например, следующим кадром данных:
+--------+--------+
| Data|Rounding|
+--------+--------+
|3.141592| 3|
|0.577215| 1|
+--------+--------+
при отправке в указанный UDF должендать следующий результат:
+--------+--------+--------------+
| Data|Rounding|Rounded Column|
+--------+--------+--------------+
|3.141592| 3| 3.142|
|0.577215| 1| 0.6|
+--------+--------+--------------+
В частности, я пробовал следующий код:
import pandas as pd
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, FloatType, LongType,
IntegerType
pdDF = pd.DataFrame(columns=["Data", "Rounding"], data=[[3.141592, 3],
[0.577215, 1]])
mySchema = StructType([ StructField("Data", FloatType(), True),
StructField("Rounding", IntegerType(), True)])
spark = SparkSession.builder.master("local").appName("column
rounding").getOrCreate()
df = spark.createDataFrame(pdDF,schema=mySchema)
df.show()
def round_column(Data, Rounding):
return (lambda (Data, Rounding): round(Data, Rounding), FloatType())
spark.udf.register("column rounded to the precision specified by another",
round_column, FloatType())
df_rounded = df.withColumn('Rounded Column', round_column(df["Data"],
df["Rounding"]))
df_rounded .show()
, но я получаю следующую ошибку:
Traceback (most recent call last):
File "whatever.py", line 21, in <module>
df_redondeado = df.withColumn('columna_redondeada',round_column(df["Data"], df["Rounding"]))
File "whomever\spark\spark-2.3.1-bin-hadoop2.7\python\pyspark\sql\dataframe.py", line 1848, in withColumn
assert isinstance(col, Column), "col should be Column"
AssertionError: col should be Column
Любойпомощь будет высоко ценится:)