Không có chức năng tích hợp (nếu bạn làm việc với hỗ trợ SQL và Hive, bạn có thể sử dụng stack
function, nhưng không được hiển thị trong Spark và không có triển khai gốc) nhưng không đáng kể. nhập khẩu yêu cầu: thực hiện
from pyspark.sql.functions import array, col, explode, lit, struct
from pyspark.sql import DataFrame
from typing import Iterable
Ví dụ:
def melt(
df: DataFrame,
id_vars: Iterable[str], value_vars: Iterable[str],
var_name: str="variable", value_name: str="value") -> DataFrame:
"""Convert :class:`DataFrame` from wide to long format."""
# Create array<struct<variable: str, value: ...>>
_vars_and_vals = array(*(
struct(lit(c).alias(var_name), col(c).alias(value_name))
for c in value_vars))
# Add to the DataFrame and explode
_tmp = df.withColumn("_vars_and_vals", explode(_vars_and_vals))
cols = id_vars + [
col("_vars_and_vals")[x].alias(x) for x in [var_name, value_name]]
return _tmp.select(*cols)
Và một số xét nghiệm (dựa trên Pandas doctests):
import pandas as pd
pdf = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},
'B': {0: 1, 1: 3, 2: 5},
'C': {0: 2, 1: 4, 2: 6}})
pd.melt(pdf, id_vars=['A'], value_vars=['B', 'C'])
A variable value
0 a B 1
1 b B 3
2 c B 5
3 a C 2
4 b C 4
5 c C 6
sdf = spark.createDataFrame(pdf)
melt(sdf, id_vars=['A'], value_vars=['B', 'C']).show()
+---+--------+-----+
| A|variable|value|
+---+--------+-----+
| a| B| 1|
| a| C| 2|
| b| B| 3|
| b| C| 4|
| c| B| 5|
| c| C| 6|
+---+--------+-----+
Lưu ý: Để sử dụng với các phiên bản Python cũ, hãy xóa chú thích loại.
Kiểm tra điều này: http://chappers.github.io/web%20micro%20log/2016/03/07/implementing-simple-melt-function-for-pyspark/ – MYGz
Xin lỗi vì phản hồi bị chậm ... Lỗi lỗi công việc ngay cả đối với một tập dữ liệu mẫu nhỏ (rdd) được tạo với rdd = sc.parallelize ([("x", 1,4), ("y", 3,5), ("z", 2 , 6)]) –