spark:如何用“;”读取csv作为分隔符和“,”作为小数点分隔符?

问题描述 投票:0回答:2

我的 csv 文件有问题,其中包含“7,27431439586819e-05”这样的十进制值

spark.read.option("header", "true")\
    .option("delimiter", ";")\
    .option("locale", "fr-FR")\ *doesnt work...*
    .option("inferSchema", "true")\
   .csv("file.csv").toPandas()

逗号似乎不是标准逗号,我找不到指定符号的选项 (.option('decimal',',') 不存在,.option('locale','fr-FR')不起作用)

你有什么想法吗?我也尝试了 re.sub("[^0-9]", ".") 然后意识到我有科学价值('e-')所以它也不起作用。

apache-spark
2个回答
1
投票

尝试使用 pyspark 中的 regexp_replace() 函数将“,”替换为“.”然后转换为 DoubleType()。

import pandas as pd
import pyspark.sql.functions as F
from pyspark.sql.types import DoubleType

df = pd.DataFrame({"Name": ['a', 'b', 'c'], "Measures":["7,27431439586819e-05",  "15,4689439586819e-01",  "-2,97431439586819e02"]})
dfs = spark.createDataFrame(df)
dfs_transformed = dfs.withColumn('Measures', F.regexp_replace('Measures', ',', '.').cast(DoubleType()))

dfs_transformed.show()

您应该获得正确输入的值:

 +----+-------------------+
 |Name|           Measures|
 +----+-------------------+
 |   a|7.27431439586819E-5|
 |   b|   1.54689439586819|
 |   c|  -297.431439586819|
 +----+-------------------+

0
投票

如果您手动指定模式并将该字段类型设置为

DecimalType(30, 15)
(例如 30 和 15),它就可以工作,但“e”必须很大,“E”。 这个csv:

id;value
a;7,27431439586819E-05
b;7,27431439586819E05
c;7,27431439586819E-02

加载此代码:

from pyspark.sql.types import *
schema = StructType(fields = [StructField("id", StringType()), StructField("value", DecimalType(25, 15))])
sdf = (ss.read.options(header=True, delimiter=';', locale="fr-FR")
       .schema(schema)
       .csv('test.csv').show(10, False)
      )

正确阅读:

+---+----------------------+
|id |value                 |
+---+----------------------+
|a  |0.000072743143959     |
|b  |727431.439586819000000|
|c  |0.072743143958682     |
+---+----------------------+
© www.soinside.com 2019 - 2024. All rights reserved.