我想将数据帧写入CSV文件,并在编写文件时删除比例值。如果比例为00
,则另外写入比例。
例如,假设我有数据帧以下。
+--------------+--------+--------+
| id |date |amount |
+--------------+--------+--------+
|12345678911.00|11/24/17| 203.02|
|12345678911.00|11/24/17| 13.52|
|12345678912.00|11/24/17| 28.00|
|12345678913.00|11/24/17| 105.71|
|12345678914.00|11/24/17| 7.68|
|12345678915.00|11/24/17| 0.18|
|12345678916.00|11/24/17| 530.38|
|12345678917.00|11/24/17| 1.79|
|12345678918.00|11/24/17| 35.00|
|12345678923.00|11/24/17| 8.84|
|12345678922.00|11/24/17| 150.47|
|12345678922.00|11/24/17| 39.00|
|12345678925.00|11/24/17| 6.46|
|12345678927.00|11/24/17| 2.59|
|12345678928.00|11/24/17| 25.00|
|12345678929.00|11/24/17| 44.04|
|12345678930.00|11/24/17| 3.90|
|12345678933.00|11/24/17| 50.00|
|12345678932.00|11/24/17| 6.26|
|12345678931.00|11/24/17| 10.90|
+--------------+--------+--------+
当我们写入csv文件时,输出应该从所有十进制类型列的每行中删除.00
。
我们通过传递模式来读取csv中的值,我们在其中定义了几列DecimalType
。
预计产量将是。
+--------------+--------+--------+
| id |date |amount |
+--------------+--------+--------+
|12345678911 |11/24/17| 203.02|
|12345678911 |11/24/17| 13.52|
|12345678912 |11/24/17| 28|
|12345678913 |11/24/17| 105.71|
|12345678914 |11/24/17| 7.68|
|12345678915 |11/24/17| 0.18|
|12345678916 |11/24/17| 530.38|
|12345678917 |11/24/17| 1.79|
|12345678918 |11/24/17| 35|
|12345678923 |11/24/17| 8.84|
|12345678922 |11/24/17| 150.47|
|12345678922 |11/24/17| 39|
|12345678925 |11/24/17| 6.46|
|12345678927 |11/24/17| 2.59|
|12345678928 |11/24/17| 25|
|12345678929 |11/24/17| 44.04|
|12345678930 |11/24/17| 3.90|
|12345678933 |11/24/17| 50|
|12345678932 |11/24/17| 6.26|
|12345678931 |11/24/17| 10.90|
+--------------+--------+--------+
我试图将它转换为StringType,但它没有多大帮助。 欢迎任何建议。
答案 0 :(得分:3)
用regexp_replace
替换结果并将输出写为字符串是最接近的事情:
from pyspark.sql.functions import regexp_replace
df = spark.createDataFrame(
[("203.02", ), ("0.18", ), ("3", ), ("10.90", )],
("amount", )
).withColumn("amount", col("amount").cast("decimal(38, 2)"))
df.select(regexp_replace("amount", "\\.00$", "")).show()
#+-------------------------------+
#|regexp_replace(amount, \.00$, )|
#+-------------------------------+
#| 203.02|
#| 0.18|
#| 3|
#| 10.90|
#+-------------------------------+