一、sparksql 行转列:
在 Spark SQL 中,你可以使用 pivot
函数将行转换为列。pivot
函数可以帮助你重新排列数据,将某些行值作为列,并根据指定的聚合函数对这些值进行汇总。以下是一个示例:
假设你有一个包含以下数据的表 sales_data
:
| date | product | amount |
|------------|---------|--------|
| 2023-01-01 | A | 100 |
| 2023-01-01 | B | 200 |
| 2023-01-02 | A | 150 |
| 2023-01-02 | B | 250 |
现在,你想将 product
列中的值转换为列,可以按照 date
进行分组,并且对应每个日期的 product
下的 amount
进行求和。可以使用 pivot
函数实现这个目标:
val df = spark.read // 从数据源加载数据或创建 DataFrame
// 例如:val df = spark.read.format("csv").load("path_to_your_data.csv")
import org.apache.spark.sql.functions._
val pivotedDF = df.groupBy("date")
.pivot("product")
.agg(sum("amount"))
pivotedDF.show()
这将产生类似以下的输出:
| date | A_sum | B_sum |
|------------|-------|-------|
| 2023-01-01 | 100 | 200 |
| 2023-01-02 | 150 | 250 |
在这个例子中,pivot
函数将 product
列的值(A 和 B)转换为两列,并对每个日期的 amount
进行了求和。
二、sparksql 列转行
在 Spark SQL 中,你可以使用 explode
函数将列转换为行。explode
函数可用于将包含数组的列拆分成多行,每个数组元素对应一行数据。以下是一个示例:
假设你有一个包含以下数据的表 employee_data
:
| id | name | departments |
|-----|---------|----------------|
| 1 | Alice | [Sales, HR] |
| 2 | Bob | [Engineering] |
| 3 | Charlie | [Marketing] |
现在,你想将 departments
列中的值转换为行,并保留对应的 id
和 name
。可以使用 explode
函数实现这个目标:
import org.apache.spark.sql.functions._
val df = spark.read // 从数据源加载数据或创建 DataFrame
// 例如:val df = spark.read.format("csv").load("path_to_your_data.csv")
val explodedDF = df.withColumn("department", explode(col("departments")))
.select("id", "name", "department")
explodedDF.show()
这将产生类似以下的输出:
| id | name | department |
|-----|---------|-------------|
| 1 | Alice | Sales |
| 1 | Alice | HR |
| 2 | Bob | Engineering |
| 3 | Charlie | Marketing |
在这个例子中,explode
函数将 departments
列中的数组元素拆分成多行,每个员工的每个部门对应一行,并保留了原始的 id
和 name
列。