Spark Dataframe 解析csv时出现非US格式异常错误

b4lqfgs4  于 2022-11-16  发布在  Apache
关注(0)|答案(2)|浏览(120)

我在spark中有一个 Dataframe ,其中包含一列

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。现在我想将其转换为double,如下所示:

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"失败。奇怪的是,当grep文件时,没有包含E的单个记录。
另外,df.select("y_wgs84").as[String].collect.map(format.parse(_).doubleValue)这将工作得很好。当在spark中将函数作为UDF调用时,这里有什么问题?

cbeh67ev

cbeh67ev1#

实际上,线程安全才是问题所在。

def toDouble: UserDefinedFunction = udf[Double, String](_.replace(',', '.').toDouble)

工作正常。

oxf4rvwz

oxf4rvwz2#

字符“E”表示指数和科学记数法;您将无法使用grep找到它。例如,1000万表示为1.0E7。快速的google搜索表明,这可能是某种类型的java bug https://community.oracle.com/thread/2349624?db=5。您可以在其他环境中尝试吗
我希望这不是微软Excel的魔法。一旦你在Excel中打开一个文件,它会试图通过将你的数字转换为指数表示法来提供帮助

相关问题