PySpark中的Apache Spark中是否存在等效的Pandas Melt函数,或者至少在Scala中?
我到目前为止在python中运行了一个示例数据集,现在我想将Spark用于整个数据集.
提前致谢.
我正在尝试将我的表的某些列转换为行.我正在使用Python和Spark 1.5.0.这是我的初始表:
+-----+-----+-----+-------+
| A |col_1|col_2|col_...|
+-----+-------------------+
| 1 | 0.0| 0.6| ... |
| 2 | 0.6| 0.7| ... |
| 3 | 0.5| 0.9| ... |
| ...| ...| ...| ... |
Run Code Online (Sandbox Code Playgroud)
我想有这样的事情:
+-----+--------+-----------+
| A | col_id | col_value |
+-----+--------+-----------+
| 1 | col_1| 0.0|
| 1 | col_2| 0.6|
| ...| ...| ...|
| 2 | col_1| 0.6|
| 2 | col_2| 0.7|
| ...| ...| ...|
| 3 | col_1| 0.5|
| 3 | …Run Code Online (Sandbox Code Playgroud) 我有以下格式的数据(RDD或Spark DataFrame):
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
rdd = sc.parallelize([('X01',41,'US',3),
('X01',41,'UK',1),
('X01',41,'CA',2),
('X02',72,'US',4),
('X02',72,'UK',6),
('X02',72,'CA',7),
('X02',72,'XX',8)])
# convert to a Spark DataFrame
schema = StructType([StructField('ID', StringType(), True),
StructField('Age', IntegerType(), True),
StructField('Country', StringType(), True),
StructField('Score', IntegerType(), True)])
df = sqlContext.createDataFrame(rdd, schema)
Run Code Online (Sandbox Code Playgroud)
我想做的是'重塑'数据,将Country(特别是美国,英国和CA)中的某些行转换为列:
ID Age US UK CA
'X01' 41 3 1 2
'X02' 72 4 6 7
Run Code Online (Sandbox Code Playgroud)
从本质上讲,我需要Python的pivot工作流程:
categories = ['US', 'UK', 'CA']
new_df = df[df['Country'].isin(categories)].pivot(index = 'ID',
columns = 'Country',
values = 'Score')
Run Code Online (Sandbox Code Playgroud)
我的数据集相当大,所以我不能真正地collect()将数据摄取到内存中来进行Python本身的重塑.有没有办法 …
我有一个像这样的简单数据框:
rdd = sc.parallelize(
[
(0, "A", 223,"201603", "PORT"),
(0, "A", 22,"201602", "PORT"),
(0, "A", 422,"201601", "DOCK"),
(1,"B", 3213,"201602", "DOCK"),
(1,"B", 3213,"201601", "PORT"),
(2,"C", 2321,"201601", "DOCK")
]
)
df_data = sqlContext.createDataFrame(rdd, ["id","type", "cost", "date", "ship"])
df_data.show()
+---+----+----+------+----+
| id|type|cost| date|ship|
+---+----+----+------+----+
| 0| A| 223|201603|PORT|
| 0| A| 22|201602|PORT|
| 0| A| 422|201601|DOCK|
| 1| B|3213|201602|DOCK|
| 1| B|3213|201601|PORT|
| 2| C|2321|201601|DOCK|
+---+----+----+------+----+
Run Code Online (Sandbox Code Playgroud)
我需要按日期调整它:
df_data.groupby(df_data.id, df_data.type).pivot("date").avg("cost").show()
+---+----+------+------+------+
| id|type|201601|201602|201603|
+---+----+------+------+------+
| 2| C|2321.0| null| null|
| 0| A| 422.0| 22.0| …Run Code Online (Sandbox Code Playgroud) 我手头有一个问题声明,我想在spark-sql/pyspark中取消对表的删除.我已经阅读了文档,我可以看到只支持pivot,但到目前为止还没有支持un-pivot.有没有办法实现这个目标?
让我的初始表看起来像这样:
当我使用下面提到的命令在pyspark中进行调整时:
df.groupBy("A").pivot("B").sum("C")
Run Code Online (Sandbox Code Playgroud)
我把它作为输出:
现在我想取消转动的表格.通常,此操作可能会/可能不会根据我转动原始表的方式产生原始表.
到目前为止,Spark-sql并不提供对unpivot的开箱即用支持.有没有办法实现这个目标?
我在Scala中使用Spark。在Spark版本1.5中,我正在尝试将具有名称值组合的输入数据框转换为新的数据框,在该数据框中,所有名称都将转换为列和值作为行。
I / P数据帧:
ID Name Value
1 Country US
2 Country US
2 State NY
3 Country UK
4 Country India
4 State MH
5 Country US
5 State NJ
5 County Hudson
Run Code Online (Sandbox Code Playgroud)
转置的DataFrame
ID Country State County
1 US NULL NULL
2 US NY NULL
3 UK NULL NULL
4 India MH NULL
5 US NJ Hudson
Run Code Online (Sandbox Code Playgroud)
链接到转置后的图像
似乎在这种用例中像数据透视一样会有所帮助,但spark 1.5.x版本不支持此功能。
有指针/帮助吗?
正如主题所描述的,我有一个 PySpark 数据框,我需要将三列融合成行。每列基本上代表一个类别中的一个事实。最终目标是将数据聚合到每个类别的单个总数中。
这个数据帧中有数千万行,所以我需要一种方法来在 Spark 集群上进行转换而不将任何数据带回驱动程序(在这种情况下为 Jupyter)。
这是我的几个商店的数据框的摘录:
+-----------+----------------+-----------------+----------------+
| store_id |qty_on_hand_milk|qty_on_hand_bread|qty_on_hand_eggs|
+-----------+----------------+-----------------+----------------+
| 100| 30| 105| 35|
| 200| 55| 85| 65|
| 300| 20| 125| 90|
+-----------+----------------+-----------------+----------------+
这是所需的结果数据帧,每个商店多行,其中原始数据帧的列已融合到新数据帧的行中,每个原始列在新类别列中占一行:
+-----------+--------+-----------+
| product_id|CATEGORY|qty_on_hand|
+-----------+--------+-----------+
| 100| milk| 30|
| 100| bread| 105|
| 100| eggs| 35|
| 200| milk| 55|
| 200| bread| 85|
| 200| eggs| 65|
| 300| milk| 20|
| 300| bread| 125|
| 300| eggs| 90|
+-----------+--------+-----------+
最终,我想聚合结果数据框以获得每个类别的总数:
+--------+-----------------+
|CATEGORY|total_qty_on_hand|
+--------+-----------------+
| milk| 105|
| bread| …
我们使用melt和dcast来转换宽 - >长 - 长 - >宽格式的数据.有关详细信息,请参阅http://seananderson.ca/2013/10/19/reshape.html.
scala或SparkR都可以.
我已经浏览了这个博客和scala函数以及R API.我没有看到做类似工作的功能.
Spark中有任何等效功能吗?如果没有,在Spark中有没有其他方法可以做到这一点?
我正在尝试将行中的值与其另一列中的值转换为不同的列。例如 -
输入数据框就像 -
+-----------+
| X | Y | Z |
+-----------+
| 1 | A | a |
| 2 | A | b |
| 3 | A | c |
| 1 | B | d |
| 3 | B | e |
| 2 | C | f |
+-----------+
Run Code Online (Sandbox Code Playgroud)
输出数据框应该是这样的 -
+------------------------+
| Y | 1 | 2 | 3 |
+------------------------+
| A | a | b | c |
| B …Run Code Online (Sandbox Code Playgroud) 如何在 Pyspark 中转置以下数据框?
这个想法是为了实现下面出现的结果。
import pandas as pd
d = {'id' : pd.Series([1, 1, 1, 2, 2, 2, 3, 3, 3], index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
'place' : pd.Series(['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'], index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
'value' : pd.Series([10, 30, 20, 10, 30, 20, 10, 30, 20], index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']),
'attribute' : pd.Series(['size', 'height', 'weigth', 'size', 'height', 'weigth','size', 'height', 'weigth'], …Run Code Online (Sandbox Code Playgroud) 我是Spark-SQL的新手。我在Spark Dataframe中有这样的信息
Company Type Status
A X done
A Y done
A Z done
C X done
C Y done
B Y done
Run Code Online (Sandbox Code Playgroud)
我想像下面这样显示
Company X-type Y-type Z-type
A done done done
B pending done pending
C done done pending
Run Code Online (Sandbox Code Playgroud)
我无法实现这是Spark-SQL
请帮忙
可能是一个愚蠢的问题,但我注意到:
val aggDF = df.groupBy("id").pivot("col1")
Run Code Online (Sandbox Code Playgroud)
导致调用 Job。使用 Notebook 在 Databricks 下运行。这样就得到了:
(1) Spark Jobs
Job 4 View (Stages: 3/3)
Stage 12: 8/8
Stage 13: 200/200
Stage 14: 1/1
Run Code Online (Sandbox Code Playgroud)
我不知道pivot这是文档中的操作。
与往常一样,我无法在文档中找到合适的参考来解释这一点,但可能与被pivot视为操作或调用 Spark 的某个方面(即操作)有关。
我有一个数据框看起来像:
item_id week_id sale amount
1 1 10
1 2 12
1 3 15
2 1 4
2 2 7
2 3 9
Run Code Online (Sandbox Code Playgroud)
我想将此数据帧转换为新的数据框,如下所示:
item_id week_1 week_2 week_3
1 10 12 15
2 4 7 9
Run Code Online (Sandbox Code Playgroud)
这可以在R中轻松完成,但我不知道如何使用Scala使用Spark API.