cha*_*ium 4 sql casting apache-spark
使用Spark 2.1(在Databricks上),我有一个表,它有一个String类型的列,作为从.CSV文件导入的结果.在针对该表的SELECT查询中,我试图在数学运算中使用列值之前将该列的值转换为整数.我一直无法找到正确的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)
Run Code Online (Sandbox Code Playgroud)
如果我能找到相关的文档,将会很有帮助.我也希望与其他类型进行其他类型的转换(或演员表).非常感谢任何一个或两个的指导.
Har*_*edi 10
您可以使用inferSchema选项Integer从csv文件中获取它,如下所示:
val df = spark.read.option("inferSchema", true).csv("file-location")
Run Code Online (Sandbox Code Playgroud)
话虽如此:inferSchema选项有时会犯错并将类型设为String.如果是这样,你可以使用cast运营商Column
数据框/数据集实现:
val df2 = df.withColumn("Count1", $"Count1" cast "Int" as "landMass").withColumn("Count1", $"Sum_GN_POP" cast "Int" as "totalPopulation")
Run Code Online (Sandbox Code Playgroud)
SQL实现:
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)
Run Code Online (Sandbox Code Playgroud)
总结:
Apache Spark 的 SQL与Apache Hive部分兼容。所以,大多数可以用 Hive 编写的 SQL 都可以用 Spark SQL 编写。
详细信息:
要将 STRING 转换为特定的数字类型(如 INT),可以使用强制转换。强制转换包括用括号将目标括起来,并在括号前加上要更改的类型。例如,演员表可能如下所示:
INT(someStringValue)
Run Code Online (Sandbox Code Playgroud)
因此,要使原始发布问题中的 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)
Run Code Online (Sandbox Code Playgroud)