spark dataframe 解析非美国格式的 csv 奇怪错误
spark dataframe parse csv with non US format strange error
我在 spark 中有一个数据框,其中包含一列
df.select("y_wgs84").show
+----------------+
| y_wgs84|
+----------------+
|47,9882373902965|
|47,9848921211406|
|47,9781530280939|
|47,9731284286555|
|47,9889813907224|
|47,9881440349524|
|47,9744969812356|
|47,9779388492231|
|48,0107946653620|
|48,0161245749621|
|48,0176065577678|
|48,0029496680229|
|48,0061848607139|
|47,9947482295108|
|48,0055828684523|
|48,0148743653486|
|48,0163361315735|
|48,0071490870937|
|48,0178054077099|
|47,8670099558802|
+----------------+
因为这些是由 spark.read.csv()
读取的,所以它的模式是 String
类型。现在我想将其转换为双精度,如下所示:
val format = NumberFormat.getInstance(Locale.GERMANY)
def toDouble: UserDefinedFunction = udf[Double, String](format.parse(_).doubleValue)
df2.withColumn("y_wgs84", toDouble('y_wgs84)).collect
但失败并显示 java.lang.NumberFormatException: For input string: ".E0"
奇怪的是,在搜索文件时,没有包含 E
.
的单个记录
此外,df.select("y_wgs84").as[String].collect.map(format.parse(_).doubleValue)
这会很好用。
在 spark 中将函数作为 UDF 调用时有什么问题?
字符'E'用于指数和科学记数法;您将无法使用 grep 找到它。例如1000万表示为1.0E7
快速 google 搜索表明它可能是 java 某种类型的错误 https://community.oracle.com/thread/2349624?db=5
你能试试不同的环境吗
其实线程安全就是问题所在。所以将解析函数更改为
def toDouble: UserDefinedFunction = udf[Double, String](_.replace(',', '.').toDouble)
工作正常。
我在 spark 中有一个数据框,其中包含一列
df.select("y_wgs84").show
+----------------+
| y_wgs84|
+----------------+
|47,9882373902965|
|47,9848921211406|
|47,9781530280939|
|47,9731284286555|
|47,9889813907224|
|47,9881440349524|
|47,9744969812356|
|47,9779388492231|
|48,0107946653620|
|48,0161245749621|
|48,0176065577678|
|48,0029496680229|
|48,0061848607139|
|47,9947482295108|
|48,0055828684523|
|48,0148743653486|
|48,0163361315735|
|48,0071490870937|
|48,0178054077099|
|47,8670099558802|
+----------------+
因为这些是由 spark.read.csv()
读取的,所以它的模式是 String
类型。现在我想将其转换为双精度,如下所示:
val format = NumberFormat.getInstance(Locale.GERMANY)
def toDouble: UserDefinedFunction = udf[Double, String](format.parse(_).doubleValue)
df2.withColumn("y_wgs84", toDouble('y_wgs84)).collect
但失败并显示 java.lang.NumberFormatException: For input string: ".E0"
奇怪的是,在搜索文件时,没有包含 E
.
此外,df.select("y_wgs84").as[String].collect.map(format.parse(_).doubleValue)
这会很好用。
在 spark 中将函数作为 UDF 调用时有什么问题?
字符'E'用于指数和科学记数法;您将无法使用 grep 找到它。例如1000万表示为1.0E7 快速 google 搜索表明它可能是 java 某种类型的错误 https://community.oracle.com/thread/2349624?db=5 你能试试不同的环境吗
其实线程安全就是问题所在。所以将解析函数更改为
def toDouble: UserDefinedFunction = udf[Double, String](_.replace(',', '.').toDouble)
工作正常。