我有一个如下所示的数据框
root
|-- A1: string (nullable = true)
|-- A2: array (nullable = true)
| |-- element: string (containsNull = true)
|-- A3 : string (nullable = true)
|-- A4 : array (nullable = true)
| |-- element: string (containsNull = true)
我有一个如下所示的架构 -
StructType(StructField(A1,ArrayType(StringType,true),true), StructField(A2,StringType,true), StructField(A3,IntegerType,true),StructField(A4,ArrayType(StringType,true),true)
我想将此数据帧转换为上面定义的模式。 有人可以帮我怎么做吗?
注意:- 架构和数据帧在运行时加载,并且未修复
最佳答案
您可以使用 org.apache.spark.sql.expressions.UserDefinedFunction 将字符串转换为数组,将数组转换为字符串,如下所示。
val string_to_array_udf = udf((s:String) => Array(s))
val array_to_string_udf = udf((a: Seq[String]) => a.head)
val string_to_int_udf = udf((s:String) => s.toInt)
val newDf = df.withColumn("a12", string_to_array_udf(col("a1"))).drop("a1").withColumnRenamed("a12", "a1")
.withColumn("a32", string_to_int_udf(col("a3"))).drop("a3").withColumnRenamed("a32", "a3")
.withColumn("a22", array_to_string_udf(col("a2"))).drop("a2").withColumnRenamed("a22", "a2")
newDf.printSchema
root
|-- a4: array (nullable = true)
| |-- element: string (containsNull = true)
|-- a1: array (nullable = true)
| |-- element: string (containsNull = true)
|-- a3: integer (nullable = true)
|-- a2: string (nullable = true)
关于scala - 从 Spark 中具有不同架构的现有数据帧创建另一个数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43408182/