如何将字符串值转换(或转换)为整数值?
使用Spark 2.1(在Databricks上),我有一个表格,它有一个类型为String的列作为从.CSV文件导入的结果。在针对该表的SELECT查询中,我试图在数学运算中使用列值之前将该列的值转换为Integer。我一直无法找到正确的Spark SQL“函数”来执行此操作。如何将字符串值转换(或转换)为整数值?
下面是一个SQL的例子。 “TO_NUMBER”对两个字符串中的任何一个都不起作用; Sum_GN_POP或Count1:
SELECT name AS geohashPrefix3, TO_NUMBER(Sum_GN_POP) AS totalPopulation, TO_NUMBER(Count1) AS landMass
FROM wayne_geohash3
WHERE (LENGTH(name) = 3)
如果我能找到相关文档,这将会有所帮助。我也想用其他类型进行其他类型的转换(或转换)。任何一方或双方的任何指导都将不胜感激。
总结:
阿帕奇Spark's SQL具有Apache Hive部分相容。因此,大多数可以用Hive编写的SQL都可以用Spark SQL编写。
详情:
将字符串转换为特定数值类型等INT,可以使用流延。该演员包括用圆括号包围目标,并在括号之前添加要更改的类型。例如,中投可能是这样的:
INT(someStringValue)
因此,为了在原贴问题的工作的SQL,它需要被改变,看起来像这样(用“取代了原来的功能命名为“TO_NUMBER” INT“):
SELECT name AS geohashPrefix3, INT(Sum_GN_POP) AS totalPopulation, INT(Count1) AS landMass
FROM wayne_geohash3
WHERE (LENGTH(name) = 3)
您可以使用选项则InferSchema像这样把它作为Integer
从csv
文件:
val df = spark.read.option("inferSchema", true).csv("file-location")
这就是说:inferSchema选项有时会犯错,并将类型设置为String
。如果是的话,你可以使用cast
操作上Column
据帧/数据集Implemetation:
val df2 = df.withColumn("Count1", $"Count1" cast "Int" as "landMass").withColumn("Count1", $"Sum_GN_POP" cast "Int" as "totalPopulation")
SQL Implemetation:
SELECT name AS geohashPrefix3, CAST(Sum_GN_POP as INT) AS totalPopulation, CAST(Count1 AS INT) AS landMass
FROM wayne_geohash3
WHERE (LENGTH(name) = 3)
我还没有准备好这么做。正确答案不完整。我的回答是我最初试图找到的。我仍然无法确定我的答案是否真的是演员或其他人。 – chaotic3quilibrium
我会使用UDF它,因为火花的演职人员将不捕获变量溢出:
val parseInt = udf((s:String) => scala.util.Try{Some(s.toInt)}.getOrElse(None))
Seq("100", "10000000000", "1x0")
.toDF("i")
.select(
$"i" cast "int" as "casted_result",
parseInt($"i") as "udf_result"
).show
+-------------+----------+
|casted_result|udf_result|
+-------------+----------+
| 100| 100|
| 1410065408| null|
| null| null|
+-------------+----------+
这对于Spark SQL线索来说太过分了,因为我已经知道列值已受到约束,因此在抛出查询时进行了简单的字符串到Int转换。然而,当我需要这样的防范时,你的答案仍然很有价值。 – chaotic3quilibrium
我会建议使用udf来解析.... –