Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 从spark中具有不同模式的现有数据帧创建另一个数据帧_Scala_Apache Spark_Dataframe - Fatal编程技术网

Scala 从spark中具有不同模式的现有数据帧创建另一个数据帧

Scala 从spark中具有不同模式的现有数据帧创建另一个数据帧,scala,apache-spark,dataframe,Scala,Apache Spark,Dataframe,我有一个像这样的数据框 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)

我有一个像这样的数据框

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将字符串转换为数组,将arry转换为字符串,如下所示

 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)

A1(字符串)将是一个包含一项的数组,A2(数组)将是数组第一项中的字符串?是..A2将是数组第一项中的字符串