PySpark:如何指定以逗号作为十进制的列

时间:2018-10-08 12:43:48

标签: csv pyspark format comma

我正在使用PySpark并加载csv文件。我有一列带有欧洲格式数字的列,这意味着逗号替换了点,反之亦然。

例如:我有2.416,67而不是2,416.67

My data in .csv file looks like this -    
ID;    Revenue
21;    2.645,45
23;   31.147,05
.
.
55;    1.009,11

在熊猫中,可以通过在decimal=','中指定thousands='.'pd.read_csv()选项以读取欧洲格式来轻松读取此类文件。

熊猫代码:

import pandas as pd
df=pd.read_csv("filepath/revenues.csv",sep=';',decimal=',',thousands='.')

我不知道如何在PySpark中做到这一点。

PySpark代码:

from pyspark.sql.types import StructType, StructField, FloatType, StringType
schema = StructType([
            StructField("ID", StringType(), True),
            StructField("Revenue", FloatType(), True)
                    ])
df=spark.read.csv("filepath/revenues.csv",sep=';',encoding='UTF-8', schema=schema, header=True)

有人可以建议我们如何使用上述.csv()函数在PySpark中加载此类文件吗?

2 个答案:

答案 0 :(得分:2)

由于数据格式的原因,您将无法以浮点形式读取它。您需要将其读取为字符串,将其清理然后转换为浮点数:

from pyspark.sql.functions import regexp_replace
from pyspark.sql.types import FloatType

df = spark.read.option("headers", "true").option("inferSchema", "true").csv("my_csv.csv", sep=";")
df = df.withColumn('revenue', regexp_replace('revenue', '\\.', ''))
df = df.withColumn('revenue', regexp_replace('revenue', ',', '.'))
df = df.withColumn('revenue', df['revenue'].cast("float"))

您可能也可以将所有这些链接在一起:

df = spark.read.option("headers", "true").option("inferSchema", "true").csv("my_csv.csv", sep=";")
df = (
         df
         .withColumn('revenue', regexp_replace('revenue', '\\.', ''))
         .withColumn('revenue', regexp_replace('revenue', ',', '.'))
         .withColumn('revenue', df['revenue'].cast("float"))
     )

请注意,我尚未对此进行测试,因此其中可能有一两个错字。

答案 1 :(得分:-1)

确保您的SQL表已预先设置格式,可以读取NUMERIC而不是INTEGER。在尝试弄清所有有关编码以及点和逗号等的不同格式时,我遇到了很大的麻烦。最终,这个问题更加原始了,它被预先格式化为只能读取INTEGER数字,因此,无论使用逗号还是点,都不会接受任何小数。然后,我只需要更改SQL表以接受实数(NUMERIC)即可。