【问题标题】:In Spark, how can I split one DataFrame to two DataFrames?在 Spark 中,如何将一个 DataFrame 拆分为两个 DataFrame?
【发布时间】:2019-01-14 23:12:38
【问题描述】:

我有一个DataFrame A的大数据。

我想对其应用一些过滤器并制作一个 DataFrame B,并为未过滤的数据制作另一个 DataFrame C。

综上所述,类似于下面的伪代码。

A.foreach(_ => {
  if (isFiltered(_)) addToDF_B()
  else addToDF_C()
})

而且,B 和 C 将被写入不同的表。

我尝试先过滤 B 并使用 A.except(B) 制作 C,但是如果方案具有复杂类型(映射或数组),则它不起作用。

除了过滤两次,还有什么方法可以一次性完成吗?

提前致谢。

【问题讨论】:

  • 这个问题值得链接,我认为:stackoverflow.com/questions/32970709/… 对于 RDD 来说,没有好的本地方式存在,但是通过额外的库或通过破解分区,它成为可能。

标签: apache-spark apache-spark-sql


【解决方案1】:

您可以在dataframe A 上使用简单的.filter api

val A = Seq(
  (1, 22),
  (2, 11),
  (10, 3),
  (20, 4)
).toDF("col1", "col2")

A.show(false)

你应该有A dataframe

+----+----+
|col1|col2|
+----+----+
|1   |22  |
|2   |11  |
|10  |3   |
|20  |4   |
+----+----+

将您的过滤器定义为

def filter = col("col1") < 10

并将它们应用为具有不同的dataframes

val B = A.filter(filter)
B.show(false)

输出是

+----+----+
|col1|col2|
+----+----+
|1   |22  |
|2   |11  |
+----+----+

而你的 C dataframeB dataframe 相反

val C = A.filter(!filter)
C.show(false)

输出是

+----+----+
|col1|col2|
+----+----+
|10  |3   |
|20  |4   |
+----+----+

【讨论】:

  • 对不起。就像我提到的“除了过滤两次”,我在问更好的方法。
  • 为了创建两个数据帧,我猜你将不得不做两个操作,如果不过滤两次然后过滤一次,其他操作一次。
  • 谢谢。我希望有类似“switch-case”的东西,但现在看来不可能。
  • 有火柴盒。但这很难在您的要求中实现。
  • 答案对您没有帮助吗@JaycePark?如果是,您应该考虑接受并投票。如果不是,您可以投票,我将删除该帖子
【解决方案2】:

你也可以用 SparkSql 来做

val A = Seq(
  (1, 22),
  (2, 11),
  (10, 3),
  (20, 4)
).toDF("col1", "col2")

A.show(false)

val B = spark.sql(select * from A /*where = your condition for B*/) //spark is SparkSession or SQLContext
val C = spark.sql(select * from A /*where = your condition for C*/) //spark is SparkSession or SQLContext

【讨论】:

    猜你喜欢
    • 2019-04-05
    • 2019-07-10
    • 2020-12-29
    • 2013-03-03
    • 2020-03-02
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多