我正在Pyspark上,创建了一个带有一些长型和十进制类型列的示例数据框。在这里,我想获取十进制类型的列值到两个小数点而不四舍五入。下面是我尝试过的代码。
df=spark.createDataframe(
[(324.456,hi,test),
(453.987,hello,python),
(768.66,test,java)],
["col1", "col2", "col3"])
new=df.withColumn("col4",F.substring((df.col1).cast(SringType()),1,F.instr((df.col1).cast(StringType()),".")+2))
所以在这里,我将列转换为字符串,并找到索引位置加两个(因为我需要两个小数点而不四舍五入)。但是我不是这里我得到“列”对象不是可调用错误的错误是什么。如果仅使用F.instr()函数,则工作正常。请协助其他解决方案,两个不取整就将值取到两位小数。
Expected output
col1 col2 col3 col4
324.456 hi test 324.45
453.987 hello python 453.98
768.66 test java 768.66
您正在寻找一种截断小数的方法。我建议您为此使用pyspark.sql.functions.pow
并巧妙地使用强制转换为LongType
。这样,您将10^{decimal_places}
乘以并再次除以相同的值,同时强制转换为long
以消除介于两者之间的小数点(浮点数),例如:
df2.show()
+-------+-----+------+
| col1| col2| col3|
+-------+-----+------+
|324.456| hi| test|
|453.987|hello|python|
| 768.66| test| java|
+-------+-----+------+
decimal_places = 2
truncated_value_column = f.pow(f.lit(10), decimal_places).cast('long')
df2.withColumn(
"trunc",
((f.col("col1") * truncated_value_column)).cast("long") / truncated_value_column
).show()
+-------+-----+------+------+
| col1| col2| col3| trunc|
+-------+-----+------+------+
|324.456| hi| test|324.45|
|453.987|hello|python|453.98|
| 768.66| test| java|768.66|
+-------+-----+------+------+
注意:如果您随后希望回退至string
,我建议您以后再回退。希望这会有所帮助!
您还可以在此处将带有regexp_extract
的正则表达式使用:
df.withColumn('test',F.regexp_extract(F.col("col1").cast("string"),'\d+.\d{2}',0)).show()
+-------+-----+------+------+
| col1| col2| col3| test|
+-------+-----+------+------+
|324.456| hi| test|324.45|
|453.987|hello|python|453.98|
| 768.66| test| java|768.66|
+-------+-----+------+------+