小编vis*_*raj的帖子

如何使用每行带有可变分隔符的 split 函数?

Input DF:
+-------------------+---------+
|VALUES             |Delimiter|
+-------------------+---------+
|50000.0#0#0#       |#        |
|0@1000.0@          |@        |
|1$                 |$        |
|1000.00^Test_string|^        |
+-------------------+---------+

Expected Output DF:
+-------------------+---------+----------------------+
|VALUES             |Delimiter|SPLITED_VALUES        |
+-------------------+---------+----------------------+
|50000.0#0#0#       |#        |[50000.0, 0, 0]       |
|0@1000.0@          |@        |[0, 1000.0]           |
|1$                 |$        |[1]                   |
|1000.00^Test_string|^        |[1000.00, Test_string]|
+-------------------+---------+----------------------+

  
Run Code Online (Sandbox Code Playgroud)

代码:

import sparkSession.sqlContext.implicits._
val dept = Seq(("50000.0#0#0#", "#"),("0@1000.0@", "@"),("1$", "$"),("1000.00^Test_string", "^")).toDF("VALUES", "Delimiter")
Run Code Online (Sandbox Code Playgroud)

我对 Spark 非常陌生,尝试使用另一列中的分隔符来拆分“VALUES”列的值。

尝试使用 Spark split 函数作为

val dept2 = dept.withColumn("SPLITED_VALUES", split(col("VALUES"), "#"))
Run Code Online (Sandbox Code Playgroud)

但这里 split 函数将分隔符作为常量值,我无法将其传递为

val dept2 = dept.withColumn("SPLITED_VALUES", split(col("VALUES"), col("Delimiter")))
Run Code Online (Sandbox Code Playgroud)

谁能为此提出更好的方法?

apache-spark apache-spark-sql

5
推荐指数
1
解决办法
581
查看次数

收集要设置的 Spark 数据帧列值

我遇到了需要在 Spark 数据框中将列值收集为 Set() 的情况,以查找与其他集合的差异。我有以下 2 个数据框

DF1
+----+---------+----------+----+-----------------+
|Lily|Sunflower|Windflower|Rose|Snapdragon Flower|
+----+---------+----------+----+-----------------+
|1   |2        |3         |4   |5                |
+----+---------+----------+----+-----------------+

DF2
+-----------------+
|Flowers          |
+-----------------+
|Rose             |
|Lily             |
|Tulip            |
|Orchid           |
|Snapdragon Flower|
+-----------------+
Run Code Online (Sandbox Code Playgroud)

我想找到 DF1 的列名称与 DF2 中 Flower 列的值之间的集合差异。为此,我编写了以下代码,但在它们的设置差异中创建了空值。代码:

import sparkSession.sqlContext.implicits._
val df1 = Seq(("1", "2", "3", "4", "5")).toDF("Lily", "Sunflower", "Windflower", "Rose", "Snapdragon Flower")
val df2 = Seq("Rose", "Lily", "Tulip", "Orchid", "Snapdragon Flower").toDF("Flowers")

val set1 = df1.columns.toSet
println(s"set1 => ${set1}")

val flower_values = df2.select("Flowers").collectAsList()
var set2 = …
Run Code Online (Sandbox Code Playgroud)

scala dataframe apache-spark apache-spark-sql

2
推荐指数
1
解决办法
6449
查看次数

在 spark 中,在添加新行时,它们是否可以替代 union() 函数?

在我的代码中table_df有一些列,我正在对这些列进行一些计算,例如 min、max、mean 等,并且我想创建具有指定架构 new_df_schema 的 new_df。在我的逻辑中,我编写了用于计算的 spark-sql,并将每个新生成的行附加到最初为空的 new_df 中,最后,它会生成new_df所有列的所有计算值。

但问题是当列数更多时会导致性能问题。这可以在不使用 union() 函数或任何其他提高性能的方法的情况下完成吗?

import org.apache.spark.sql.Row
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._
import sparkSession.sqlContext.implicits._

    val table_df = Seq(
      (10, 20, 30, 40, 50),
      (100, 200, 300, 400, 500),
      (111, 222, 333, 444, 555),
      (1123, 2123, 3123, 4123, 5123),
      (1321, 2321, 3321, 4321, 5321)
    ).toDF("col_1", "col_2", "col_3", "col_4", "col_5")
    table_df.show(false)

    table_df.createOrReplaceTempView("table_df")

     val new_df_schema = StructType(
      StructField("Column_Name", StringType, false) ::
        StructField("number_of_values", LongType, false) ::
        StructField("number_of_distinct_values", LongType, false) ::
        StructField("distinct_count_with_nan", LongType, false) :: …
Run Code Online (Sandbox Code Playgroud)

apache-spark apache-spark-sql

1
推荐指数
1
解决办法
675
查看次数

标签 统计

apache-spark ×3

apache-spark-sql ×3

dataframe ×1

scala ×1