将字符串列转换为以句点为小数点和千位分隔符的双精度型

时间:2018-10-26 09:19:25

标签: python regex pyspark anaconda jupyter

我正在写一个程序,用来自varios数据源的数字固定数据库列值(CSV输入)。

问题是它们同时使用点“。”和千位分隔符。

例如:

  • 100.000.000-> 10000000
  • 9.000-> 9000
  • 0.600000-> 0.6(十进制)
  • 12.000.000-> 12000000
  • 0.200000-> 0.2(十进制)
  • 1.000-> 1000
  • 700.000-> 700000

我尝试了条件正则表达式,但是我没有找到正确的方法,因此我必须分两个阶段进行操作(“何时”和正则表达式提取):

import sys
from pyspark import SQLContext, SparkContext
from pyspark.sql.types import StructType,StructField,StringType,DateType,IntegerType
sc = SparkContext()
sqlContext = SQLContext(sc)

from pyspark.sql.functions import regexp_replace, regexp_extract, col, when
df3 = sqlContext.createDataFrame([["100.000.000"],["9.000"],["0.600000"],["12.000.000"],["0.200000"],["1.000"],["700.000"]],["SENSOR_VALUE"])

df3.show()

regexDotDig6 = "\.(\d\d\d\d\d\d)";
regexDotDig3 = "\.(\d\d\d)";

df3 = df3.withColumn("SENSOR_VALUE", when(regexp_extract(df3.SENSOR_VALUE, regexDotDig6,1) == "",                                    regexp_replace(df3.SENSOR_VALUE, regexDotDig3, "$1"))                                    .otherwise(df3.SENSOR_VALUE).cast('double'))

df3.show()

有没有办法在同一个正则表达式中或更有效地做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以使用pyspark.sql.Column.startswith来检查字符串是否以"0"开头。如果是,则将其强制转换为double。如果否,则用空字符串替换句点,然后进行强制转换。

from pyspark.sql.functions import col, when, regexp_replace

df3.withColumn(
    "SENSOR_VALUE",
    when(
        col("SENSOR_VALUE").startswith("0"),
        col("SENSOR_VALUE")
    ).otherwise(regexp_replace("SENSOR_VALUE", "\.", "")).cast("double")
).show()
#+------------+
#|SENSOR_VALUE|
#+------------+
#|       1.0E8|
#|      9000.0|
#|         0.6|
#|       1.2E7|
#|         0.2|
#|      1000.0|
#|    700000.0|
#+------------+

答案 1 :(得分:0)

这不是我设法实现的最佳解决方案...

from pyspark.sql.functions import when, regexp_extract, regexp_replace

df3 = df3.withColumn(
    "SENSOR_VALUE",
    when(
        regexp_extract(df3.SENSOR_VALUE, regexDotDig6,1) == "",
        regexp_replace(df3.SENSOR_VALUE, regexDotDig3, "$1")
    ).otherwise(df3.SENSOR_VALUE).cast('double'))

df3.show()

+------------+
|SENSOR_VALUE|
+------------+
|       1.0E8|
|      9000.0|
|         0.6|
|       1.2E7|
|         0.2|
|      1000.0|
|    700000.0|
+------------+