[英]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.