PySpark通过从十进制列中删除比例来写入csv

时间:2018-01-19 22:56:08

标签: python apache-spark pyspark apache-spark-sql

我想将数据帧写入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,但它没有多大帮助。 欢迎任何建议。

1 个答案:

答案 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|
#+-------------------------------+