让我通过一个例子来解释我想做的事情。我们将首先创建一个dataframe,它包含一个行数组和嵌套行。我的整数还没有在dataframe中被抛出,它们是作为字符串创建的:
import org.apache.spark.sql._ import org.apache.spark.sql.types._ val rows1 = Seq( Row("1", Row("a", "b"), "8.00", Seq(Row("1","2"), Row("12","22"))), Row("2", Row("c", "d"), "9.00", Seq(Row("3","4"), Row("33","44"))) ) val rows1Rdd = spark.sparkContext.parallelize(rows1, 4) val schema1 = StructType( Seq( StructField("id", StringType, true), StructField("s1", StructType( Seq( StructField("x", StringType, true), StructField("y", StringType, true) ) ), true), StructField("d", StringType, true), StructField("s2", ArrayType(StructType( Seq( StructField("u", StringType, true), StructField("v", StringType, true) ) )), true) ) ) val df1 = spark.createDataFrame(rows1Rdd, schema1)
下面是创建的dataframe的模式:
df1.printSchema root |-- id: string (nullable = true) |-- s1: struct (nullable = true) | |-- x: string (nullable = true) | |-- y: string (nullable = true) |-- d: string (nullable = true) |-- s2: array (nullable = true) | |-- element: struct (containsNull = true) | | |-- u: string (nullable = true) | | |-- v: string (nullable = true)
我想要做的是将所有可以是整数的字符串转换为整数。我试着做了以下工作,但没有成功:
df1.selectExpr("CAST (id AS INTEGER) as id", "STRUCT (s1.x, s1.y) AS s1", "CAST (d AS DECIMAL) as d", "Array (Struct(CAST (s2.u AS INTEGER), CAST (s2.v AS INTEGER))) as s2").show()
我还有以下代码:
cannot resolve 'CAST(`s2`.`u` AS INT)' due to data type mismatch: cannot cast array<string> to int; line 1 pos 14;
是否有正确的查询将所有值转换为整数?
非常感谢。