当前位置: 首页 > 知识库问答 >
问题:

Scala Spark-将数据从1个Dataframe复制到另一个具有嵌套模式的DF

孔山
2023-03-14

DF1-带数据的平面数据帧

+---------+--------+-------+                                                    
|FirstName|LastName| Device|
+---------+--------+-------+
|   Robert|Williams|android|
|    Maria|Sharpova| iphone|
+---------+--------+-------+

root
 |-- FirstName: string (nullable = true)
 |-- LastName: string (nullable = true)
 |-- Device: string (nullable = true)

DF2-具有相同列名的空数据帧

+------+----+
|header|body|
+------+----+
+------+----+

root
 |-- header: struct (nullable = true)
 |    |-- FirstName: string (nullable = true)
 |    |-- LastName: string (nullable = true)
 |-- body: struct (nullable = true)
 |    |-- Device: string (nullable = true)

DF2架构代码:

val schema = StructType(Array(
StructField("header", StructType(Array(
StructField("FirstName", StringType),
StructField("LastName", StringType)))), 
StructField("body", StructType(Array(
StructField("Device", StringType))))
))

带有来自DF1的数据的DF2将是最终输出。

需要为复杂模式的多列执行此操作并使其可配置。必须在不使用case类的情况下执行此操作。

方法#1-使用架构。字段。映射到映射DF1-

方法#2-创建一个新的DF并定义数据和模式?

方法#3-使用zip和map转换定义“select col as col”查询。。不知道这是否适用于嵌套(structtype)架构

我该如何继续这样做?

共有1个答案

芮星海
2023-03-14
import spark.implicits._
import org.apache.spark.sql.functions._

val sourceDF = Seq(
  ("Robert", "Williams", "android"),
  ("Maria", "Sharpova", "iphone")
).toDF("FirstName", "LastName", "Device")

val resDF = sourceDF
  .withColumn("header", struct('FirstName, 'LastName))
  .withColumn("body", struct(col("Device")))
  .select('header, 'body)

resDF.printSchema
//  root
//  |-- header: struct (nullable = false)
//  |    |-- FirstName: string (nullable = true)
//  |    |-- LastName: string (nullable = true)
//  |-- body: struct (nullable = false)
//  |    |-- Device: string (nullable = true)

resDF.show(false)
//  +------------------+---------+
//  |header            |body     |
//  +------------------+---------+
//  |[Robert, Williams]|[android]|
//  |[Maria, Sharpova] |[iphone] |
//  +------------------+---------+
 类似资料:
  • 问题内容: 这个问题已经被问了很多遍了,而且似乎对其他人也有用,但是,当我从不同的DataFrame复制列(并且长度相同)时,我得到了值。 我需要这样 我尝试了以下方法 我得到以下内容 问题答案: 您的DataFrames的索引是不同的 (相应地,每列 的索引也不同 ),因此,当尝试将一个DataFrame的列分配给另一列时, pandas会尝试对齐索引,但这样做会失败,请插入NaN。 考虑以下示

  • 由于是一个对象,并且它有另一个对象,只能有字符串或数字字段,而不能有对象,如何扩展元化学以强制执行此操作。感谢任何帮助

  • 问题内容: 如何从一个数据库复制到另一个数据库。 数据库名称visco 我想将所有表从visco数据库复制到新数据库名称作为neptune 我创建了一个没有任何表的数据库,然后尝试从database1.bak文件还原数据库,然后显示错误为 需要查询帮助 问题答案: 使用SQL Server Management Studio: 选项1 ->右键单击要复制的数据库 ->选择“任务”>“生成脚本” -

  • 我正试图将数据复制到数组中,但出现了一个错误,称无法转换类型。我该怎么解决这个问题?

  • 问题内容: 我有两个数据库,一个叫做,一个叫做。由于我想练习插入,更新内容,因此我想将某些表从复制到。 我要复制的表称为: 我试图做的是(使用SSMS)右键单击表格,但其中没有“复制”! 问题答案: 假设您有两个数据库,例如A和B: 如果目标表不存在,将创建以下脚本(我不建议这样): INTO COPY_TABLE_HERE FROM A.dbo.table_from_A table_A 如果目标

  • 在SQL Server中,如何将数据从一个表复制/追加到具有相同架构的另一个表中? 编辑: 假设有一个问题 它使用与表2中相同的模式和数据创建表1。 有没有这样的短查询只将整个数据复制到一个已经存在的表中?