以编程方式向Spark DataFrame添加几列

埃沙列夫

我在Scala中使用Spark。

我有一个包含3列的数据框:ID,时间,RawHexdata。我有一个用户定义的函数,该函数接受RawHexData并将其扩展为X个以上的列。重要的是要声明,对于每行X都是相同的(列不变化)。但是,在接收第一个数据之前,我不知道这些列是什么。但是一旦有了头,我就可以推断出来。

我想要第二个带有所述列的数据框:Id,Time,RawHexData,NewCol1,...,NewCol3。

我可以想到的“最简单”的方法是:1.将每行反序列化为json(每个数据类型都可以在此处序列化)2.添加我的新列,3.从更改后的json反序列化新的数据帧,

但是,这似乎很浪费,因为它涉及2个昂贵且冗余的json序列化步骤。我正在寻找一种更清洁的图案。

使用案例类似乎是个坏主意,因为我不知道列数,也不知道列名。

蒂尔·罗尔曼

动态扩展您可以做的DataFrame是对RDD行进行操作,您可以通过调用获得该行dataFrame.rdd有了Row实例,您可以访问该RawHexdata列并解析包含的数据。通过将新解析的列添加到结果中Row,您几乎解决了您的问题。将a转换RDD[Row]回a的唯一必要步骤DataFrame就是为新列生成模式数据。您可以通过RawHexdata在驱动程序上收集单个值,然后提取列类型来做到这一点

以下代码说明了这种方法。

object App {

  case class Person(name: String, age: Int)

  def main(args: Array[String]) {
    val sparkConf = new SparkConf().setAppName("Test").setMaster("local[4]")
    val sc = new SparkContext(sparkConf)
    val sqlContext = new SQLContext(sc)
    import sqlContext.implicits._

    val input = sc.parallelize(Seq(Person("a", 1), Person("b", 2)))
    val dataFrame = input.df

    dataFrame.show()

    // create the extended rows RDD
    val rowRDD = dataFrame.rdd.map{
      row =>
        val blob = row(1).asInstanceOf[Int]
        val newColumns: Seq[Any] = Seq(blob, blob * 2, blob * 3)
        Row.fromSeq(row.toSeq.init ++ newColumns)
    }

    val schema = dataFrame.schema

    // we know that the new columns are all integers
    val newColumns = StructType{
      Seq(new StructField("1", IntegerType), new StructField("2", IntegerType), new StructField("3", IntegerType))
    }

    val newSchema = StructType(schema.init ++ newColumns)

    val newDataFrame = sqlContext.createDataFrame(rowRDD, newSchema)

    newDataFrame.show()
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

以编程方式向Spark DataFrame添加几列

来自分类Dev

是否可以一次向熊猫DataFrame添加几列?

来自分类Dev

以编程方式向容器添加控件

来自分类Dev

以编程方式快速向NavigationBar添加约束

来自分类Dev

以编程方式向元素添加属性

来自分类Dev

以编程方式向按钮添加操作

来自分类Dev

以编程方式向图像添加边框

来自分类Dev

以编程方式向UITextField添加约束

来自分类Dev

无法以编程方式向图层添加要素

来自分类Dev

以编程方式向视图添加约束

来自分类Dev

以编程方式向按钮添加事件

来自分类Dev

如何在Android中以编程方式向画廊添加图像或以编程方式刷新画廊

来自分类Dev

快速以编程方式向工具栏添加按钮

来自分类Dev

以编程方式向电子邮件添加签名

来自分类Dev

以编程方式向Android中的framelayout添加片段

来自分类Dev

如何以编程方式向片段添加按钮

来自分类Dev

如何以编程方式向位图图像添加文本?WPF

来自分类Dev

如何以编程方式向Wagtail StreamField添加内容?

来自分类Dev

使用CLI和宏以编程方式向Confluence添加页面

来自分类Dev

如何以编程方式向NSWindow(或NSView)添加视图?

来自分类Dev

如何以编程方式向Silverstripe添加新页面?

来自分类Dev

是否可以以编程方式向方案添加行?

来自分类Dev

以编程方式向形状(路径)添加突出显示

来自分类Dev

如何以编程方式向简单的表格布局添加边框

来自分类Dev

以编程方式向SSRS报告添加订阅

来自分类Dev

对如何以编程方式向jtable添加列感到困惑

来自分类Dev

如何以编程方式向重力形式添加条目

来自分类Dev

以编程方式向Python函数添加“装饰器”

来自分类Dev

如何以编程方式向窗口文件的图标添加指示

Related 相关文章

  1. 1

    以编程方式向Spark DataFrame添加几列

  2. 2

    是否可以一次向熊猫DataFrame添加几列?

  3. 3

    以编程方式向容器添加控件

  4. 4

    以编程方式快速向NavigationBar添加约束

  5. 5

    以编程方式向元素添加属性

  6. 6

    以编程方式向按钮添加操作

  7. 7

    以编程方式向图像添加边框

  8. 8

    以编程方式向UITextField添加约束

  9. 9

    无法以编程方式向图层添加要素

  10. 10

    以编程方式向视图添加约束

  11. 11

    以编程方式向按钮添加事件

  12. 12

    如何在Android中以编程方式向画廊添加图像或以编程方式刷新画廊

  13. 13

    快速以编程方式向工具栏添加按钮

  14. 14

    以编程方式向电子邮件添加签名

  15. 15

    以编程方式向Android中的framelayout添加片段

  16. 16

    如何以编程方式向片段添加按钮

  17. 17

    如何以编程方式向位图图像添加文本?WPF

  18. 18

    如何以编程方式向Wagtail StreamField添加内容?

  19. 19

    使用CLI和宏以编程方式向Confluence添加页面

  20. 20

    如何以编程方式向NSWindow(或NSView)添加视图?

  21. 21

    如何以编程方式向Silverstripe添加新页面?

  22. 22

    是否可以以编程方式向方案添加行?

  23. 23

    以编程方式向形状(路径)添加突出显示

  24. 24

    如何以编程方式向简单的表格布局添加边框

  25. 25

    以编程方式向SSRS报告添加订阅

  26. 26

    对如何以编程方式向jtable添加列感到困惑

  27. 27

    如何以编程方式向重力形式添加条目

  28. 28

    以编程方式向Python函数添加“装饰器”

  29. 29

    如何以编程方式向窗口文件的图标添加指示

热门标签

归档