繁体   English   中英

Spark DataFrame添加带有行的列

[英]Spark DataFrame add Column with Rows

向DataFrame添加新列和新行的最佳方法是什么?
是否可以同时执行此操作?

例如,我有一个表AB,例如:

+------+-------+
|     a|      b|
+------+-------+
|  true|   true|      
|  true|  false|   
+---+---+------+

现在,我想向AB和新行添加新列“ c”,但前提是要满足条件。 此条件应适用于AB中包含c = false和c = true的每一行。

foo(row): Boolean为条件,并:

foo(Row(true, true, false)) = true
foo(Row(true, true, true))  = true 
foo(Row(true, false, false)) = true 
foo(Row(true, false, false)) = false 

因此,新的表格ABC应该看起来像:

  +------+-------+-------+
  |     a|      b|      c|
  +------+-------+-------+
  |  true|   true|   true|      
  |  true|   true|  false|      
  |  true|  false|  false|   
  +------+-------+-------+

我试图交叉连接和过滤:

 val rows = List(Row(true), Row(false))

 val C = spark.createDataFrame(
     spark.sparkContext.parallelize(rows),
     StructType(List(StructField("c", BooleanType)))
 )

 val ABC = AB.join(C).filter(r => foo(row))

演出] 不好(你能告诉我为什么吗?)。 我也尝试过flatMap:

      val encoder = RowEncoder(AB.schema.add(StructField("c", BooleanType)))

      val ABC = AB.flatMap { row =>
        Seq(Row.fromSeq(row.toSeq :+ true), Row.fromSeq(row.toSeq :+ false)).filter(r => foo(r))
      }(encoder)

性能也很差。 大表的铸造花费的时间太长。 如我所知,强制转换应用于主节点。 对于大表(数百万行),它的性能很差。

您对此问题还有其他更好的解决方案吗?

顺便说一句,我在Scala中使用Apache Spark 2.0.1。

我认为您已经使它变得比原来更复杂了,据我所知,以下内容应该会产生您想要的结果

val stuff = List[Row](Row(true, true),Row(true, false),Row(false, true), Row(false, false))
val rows = sc.parallelize(stuff)
val schema = StructType(StructField("a", BooleanType, true) :: StructField("b", BooleanType, true) :: Nil)
val frame = spark.createDataFrame(rows, schema).withColumn("c", col("a")&&(col("b")))

那么如果你做一个frame.show它应该显示

+-----+-----+-----+
|    a|    b|    c|
+-----+-----+-----+
| true| true| true|
| true|false|false|
|false| true|false|
|false|false|false|
+-----+-----+-----+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM