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

     2023-04-14     68

关键词:

【中文标题】PySpark:如何用逗号指定列作为十进制【英文标题】:PySpark: How to specify column with comma as decimal 【发布时间】:2018-10-08 12:43:48 【问题描述】:

我正在使用 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

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

熊猫代码:

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 中加载这样的文件?

【问题讨论】:

为什么要指定分号分隔符?您提供的示例文件看起来是以空格分隔的,可能带有制表符? 这只是一个例子。好的,让我改一下。 【参考方案1】:

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

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"))
     )

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

【讨论】:

您好,非常感谢您的回复。好吧,我也在考虑它,但我认为可能有一个功能可以做到这一点。我会搜索它,如果我没有找到它,我会添加它作为答案。 AFAIK 没有功能可以仅使用 .csv() 方法来执行此操作。为什么你有这个要求? 您好,我没有这个要求。只是想使用一个内置函数(如果有的话)。但是,是的,带有替换的正则表达式就足够了:) 这是否解决了您的问题?如果可以,问题能否结束? 嗨 jhole89,只需替换 '.'和 '\\。'在第一个正则表达式中,因为 DOT 匹配正则表达式中的所有内容并将 FloatType 更改为“float”以使此代码正常工作。除此之外,代码运行良好。【参考方案2】:

如果您的数据集有很多浮点列,但数据集的大小仍然足够小,可以先使用 pandas 对其进行预处理,我发现执行以下操作会更容易。

import pandas as pd

df_pandas = pd.read_csv('yourfile.csv', sep=';', decimal=',')
df_pandas.to_csv('yourfile__dot_as_decimal_separator.csv', sep=';', decimal='.') # optionally also header=True of course.

df_spark = spark.csv.read('yourfile__dot_as_decimal_separator.csv', sep=';', inferSchema=True) # optionally also header=True of course.

我确实发现 jhole89 的答案非常有用,但发现将它应用于具有很多列(数百列)的数据集很痛苦。

我的意思是:

手动指定浮点列并对其进行转换非常费力, 尝试通过检查哪些列是字符串类型并包含逗号来动态查找它们,避免不考虑带有毫秒分隔符的日期时间列等,在某些列上强制转换为浮点数,因为它们是包含文本的逗号,但不打算被解析为浮点数:这会导致头痛。

因此,如果有多个浮点列并且你的数据集可以用pandas进行预处理,你可以应用上面的代码。

【讨论】:

【参考方案3】:

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

【讨论】:

请发布一些代码来激发您的回答。到目前为止,经过和很多人讨论,我还没有找到任何方法将European/German格式的数字导入PySpark。 @jhole89 提供的答案是大多数人所做的。如果您找到了一种方法,请通过发布必要的代码来证明这一点。非常感谢。 我的表看起来像这样: CREATE TABLE PUBLIC.ECOSTAT ( DEST CHAR(50), AIRLINE CHAR(50), SHP_WEIGHT INTEGER );我正在尝试使用以下格式导入 SHP_WEIGHT 的数据:122.5、2500.5、750.3(这是英文格式,点而不是逗号)。问题不在于我有一台德国服务器,而在于我如何创建表。我已将变量 SHP_WEIGHT 创建为 INTEGER,并且整数不采用十进制数。然后我修改了表格并重新创建了 SHP_WEIGHT NUMERIC(它接受像 122.5 这样的实数)并且它起作用了! 我认为你完全没有抓住重点。参考您的示例,我的数据将类似于 122,4; 2500,5; 750,3。 PySpark 中没有可以处理此问题的 DataType - spark.apache.org/docs/2.1.2/api/python/_modules/pyspark/sql/… 我们必须将其作为字符串导入 Schema 中,然后转换为正确的英式格式,然后转换为 float/int。这就是@jhole89 在他的回答中所暗示的。感谢您的努力。

如何用另一列作为色调绘制布尔列?

】如何用另一列作为色调绘制布尔列?【英文标题】:Howtodrawbooleancolumnswithanothercolumnashue?【发布时间】:2021-04-2915:54:35【问题描述】:我在这里遇到了一些问题。我有一个这样的数据集:IDBoolean1Boolean2Class1TrueTrue1-52TrueFalse10-153Fa... 查看详情

如何用sql语句将一列多行数据拼接逗号隔开形成一条记录

mysql中,有标准函数,group_concat(name),直接返回连接好的字符串,并以逗号分割,如果记录比较多,超过函数返回值的最大值,可以调整mysql启动参数,增加显示值的长度。参考技术AOracle有个wm_concat函数 参考技术Bselectwmsys.wm_conca... 查看详情

如何用逗号分割行并在 PostgreSQL 中取消透视表?

】如何用逗号分割行并在PostgreSQL中取消透视表?【英文标题】:HowtosplittherowbyacommaandunpivotthetableinPostgreSQL?【发布时间】:2022-01-2320:58:30【问题描述】:我有这张表,我想用逗号分隔列并取消透视它我的桌子+------------+--------------... 查看详情

如何用引号和逗号连接多列单元格数据

】如何用引号和逗号连接多列单元格数据【英文标题】:howtoconcatenatemulticolumncelldatawithquotationsandcommas【发布时间】:2022-01-1618:27:18【问题描述】:我有50列数据,从“G”到“BD”,记录数据按行组织。有些单元格有数据,有些则... 查看详情

如何用逗号和空格java分割表达式

...:[some,blabla,sentence,example]我可以用逗号分隔,但不知道如何用逗号和空格分割?我的源代码,到目前为止:string.split("s*,s*")答案您可以使用一组字符作为分隔符,如Pattern中所述Stringstring="Onestepat,,a,time,.";System. 查看详情

Inferschema 检测列作为字符串而不是来自 pyspark 中镶木地板的双精度

...ks在pyspark中读取镶木地板文件。有些列有很多空值并且有十进制值,这些列被读取为字符串而不是双 查看详情

如何用 sacala 代码详细说明 pyspark 代码?

】如何用sacala代码详细说明pyspark代码?【英文标题】:Howelaboratepysparkcodewithsacalacode?【发布时间】:2018-05-1514:55:46【问题描述】:我想在Pyspark代码中转换这个Scala代码。Scala代码:Row=valcolumnArray=newArray[String](95)columnArray(0)=x.substrin... 查看详情

使用 PySpark 删除 Dataframe 的嵌套列

】使用PySpark删除Dataframe的嵌套列【英文标题】:DroppingnestedcolumnofDataframewithPySpark【发布时间】:2017-07-1214:55:52【问题描述】:我正在尝试使用pyspark在Spark数据框中删除一些嵌套列。我为Scala找到了这个,它似乎正在做我想做的事... 查看详情

Pyspark 字符串到十进制转换以及精度和格式,如 Java 十进制格式化程序

】Pyspark字符串到十进制转换以及精度和格式,如Java十进制格式化程序【英文标题】:PysparkStringtoDecimalConversionalongwithprecisionandformatlikeJavadecimalformatter【发布时间】:2020-05-2216:33:30【问题描述】:我正在尝试将字符串转换为十进... 查看详情

如何用r语言在数据中提取指定列数据,并且形成一个新的数据表

1、分析数据表:通过浏览“入库明细”表,我们可能看到入库明细表中,作为提取记录的条件零件号在A列。需要提取的记录,入库日期在H列、入库单号在O列、最后生产批号在L列、入库前库存数在Q列。为DC000496ZL的记录有5条(... 查看详情

如何使用逗号分隔值拆分列并存储在 PySpark Dataframe 中的数组中?如下所示

】如何使用逗号分隔值拆分列并存储在PySparkDataframe中的数组中?如下所示【英文标题】:HowtosplitacolumnwithcommaseparatedvaluesandstoreinarrayinPySpark\'sDataframe?Asgivenbelow【发布时间】:2020-03-1021:43:44【问题描述】:我有一个PySpark数据框,... 查看详情

如何用 Pyspark 的 SVM 拟合两个 numpy 矩阵?

】如何用Pyspark的SVM拟合两个numpy矩阵?【英文标题】:HowtofittwonumpymatriceswithPyspark\'sSVM?【发布时间】:2016-07-0206:28:50【问题描述】:我有两个这样的numpy矩阵:Features:(878049,6)<type\'numpy.ndarray\'>Labels:(878049,)<type\'numpy.ndarray\'&g... 查看详情

如何用逗号而不是空格分割列表

】如何用逗号而不是空格分割列表【英文标题】:Howtosplitalistbycommanotspace【发布时间】:2011-12-0419:42:54【问题描述】:我想在forfooinlist中用逗号,而不是空格分割文本。假设我有一个CSV文件CSV_File,其中包含以下文本:Hello,World,Que... 查看详情

使用“MultiAutoCompleteTextView”时如何用空格替换逗号

】使用“MultiAutoCompleteTextView”时如何用空格替换逗号【英文标题】:HowtoreplacethecommawithaspacewhenIusethe"MultiAutoCompleteTextView"【发布时间】:2011-03-2919:40:11【问题描述】:我正在做一个简单的程序,使用MultiAutoCompleteTextView在... 查看详情

如何用 C 编写散列函数?

】如何用C编写散列函数?【英文标题】:HowtowriteahashfunctioninC?【发布时间】:2011-01-1508:05:54【问题描述】:哈希表被认为是存储/检索数据的最快/最佳方式。我对哈希表的理解,哈希如下(如有错误请指正或如有补充请补充):... 查看详情

如何用逗号分割字符串而不在perl的引号内包含逗号?

】如何用逗号分割字符串而不在perl的引号内包含逗号?【英文标题】:Howtosplitastringbycommawithoutincludingcommainsidethequotationmarkinperl?【发布时间】:2011-11-2211:46:57【问题描述】:我有以下代码:my$file=\'c:\\test.log\';open(FILE,"<",$file)ord... 查看详情

如何用括号外的逗号分割字符串?

】如何用括号外的逗号分割字符串?【英文标题】:Howtosplitastringbycommaspositionedoutsideofparenthesis?【发布时间】:2010-12-1112:52:27【问题描述】:我得到了这样格式的字符串:"WilburSmith(Billy,sonofJohn),EddieMurphy(John),ElvisPresley,JaneDoe(JaneDoe... 查看详情

PySpark:如何为数组列中的每个元素添加值?

】PySpark:如何为数组列中的每个元素添加值?【英文标题】:PySpark:Howtoaddvaluetoeachelementinacolumnofarrays?【发布时间】:2021-09-1505:27:24【问题描述】:我在PySpark中有一个DF数组列,我想将数字1添加到每个数组中的每个元素。这是DF... 查看详情