У меня есть такой фрейм данных:
rdd1 = sc.parallelize([(100,2,1234.5678),(101,3,1234.5678)])
df = spark.createDataFrame(rdd1,(['id','dec','val']))
+---+---+---------+
| id|dec| val|
+---+---+---------+
|100| 2|1234.5678|
|101| 3|1234.5678|
+---+---+---------+
Исходя из значения, доступного в столбце dec
, я хочу, чтобы приведение было выполнено к столбцу val
. Например, если dec = 2
, тогда я хочу, чтобы val
был приведен к DecimalType(7,2)
.
Я пытался сделать ниже, но это не работает:
df.select(col('id'),col('dec'),col('val'),col('val').cast(DecimalType(7,col('dec'))).cast(StringType()).alias('modVal')).show()
Сообщение об ошибке:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/spark/python/pyspark/sql/column.py", line 419, in cast
jdt = spark._jsparkSession.parseDataType(dataType.json())
File "/usr/lib/spark/python/pyspark/sql/types.py", line 69, in json
return json.dumps(self.jsonValue(),
File "/usr/lib/spark/python/pyspark/sql/types.py", line 225, in jsonValue
return "decimal(%d,%d)" % (self.precision, self.scale)
TypeError: %d format: a number is required, not Column
То же самое работает, если я жестко закодирую значение для определенного числа, что прямо.
df.select(col('id'),col('dec'),col('val'),col('val').cast(DecimalType(7,3)).cast(StringType()).alias('modVal')).show()
+---+---+---------+--------+
| id|dec| val| modVal|
+---+---+---------+--------+
|100| 2|1234.5678|1234.568|
|101| 3|1234.5678|1234.568|
+---+---+---------+--------+
Пожалуйста, помогите мне с этим.