scala - 从 Spark 中具有不同架构的现有数据帧创建另一个数据帧

标签 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)

我有一个如下所示的架构 -

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/

相关文章:

scala - 选项方法签名,功能已在此范围内定义

apache-spark - 使用 S3 时支持 Parquet 作为输入/输出格式

apache-spark - 使用 Spark-submit 时禁用 Ivy Logging

python - 如何使用 pandas 数据框的 if 条件

python - 使用一个数据帧在其他数据帧上创建组,然后取平均值

Scala:清理构造函数参数

java - 当需要 Scala 的列表时,使用 java.util.List 从 Java 调用 Scala 代码

scala - SBT : Running Spark job on remote cluster from sbt

python - 从不同长度的字符串值中提取某些整数,其中包含不需要的整数。图案或位置

scala - Scala RDD 不协变的解决方法