簡體   English   中英

使用列值在Spark數據幀中強制轉換另一列

[英]Using a columns value in casting another column in a spark dataframe

我有一個這樣的數據框:

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)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|
+---+---+---------+--------+

請幫我解決一下這個。

Spark(或與此相關的任何關系系統)中的列必須是同質的-這樣的操作( cast每行轉換為不同的類型)不僅不受支持,而且意義不大。

如user10281832所述,同一列中不能有不同的數據類型。

由於格式化是重點,因此您可以將列轉換為字符串類型,然后進行格式化。 由於每一行的小數位數不同,因此您不能使用任何內置的Spark函數,但需要定義一個自定義UDF

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType

def format_val(num, prec):
    return "%0.*f" % (prec, num)

format_val_udf = udf(format_val, StringType())

df.withColumn('modVal', format_val_udf('val', 'dec'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM