首先-感谢您抽出宝贵时间阅读我的问题。
我试图摆脱Pyspark的束缚,但是我对pyspark中RDD和DF的差异感到困惑。
我的数据:我的数据结构如下:
+-------+-------------+-------+------+-----+
| ID| date| ticker|Return| Year|
+-------+-------------+-------+----- +-----+
| 215021|2018-04-12 | XYZ | 0.21 | 2018|
| 205021|2018-04-13 | XYZ | 0.18 | 2018|
... ... ... ... ...
| 5102 |2012-01-14 | ABC | 0.21 | 2012|
| 5102 |2012-01-05 | ABC |-1.01 | 2012|
... ... ... ... ...
+-------+-------------+-------+------+-----+
从本质上讲-我有股票和它们的收益的DF。我真正关心的列是Return和Year。我想计算每年的平均回报...
在Python中,它将是:
df.groupby('Year').sum()
但是,我对如何在Pyspark中执行此操作感到非常困惑。这是到目前为止我尝试过的一些思考过程和代码...
我想我需要为每一行创建一个<key><value>
对,这意味着我的密钥将是<year>
,而值将是<return>
。也许使用映射功能?不太确定,但这是我尝试做的事情:
df.rdd.map(lambda y: (int(y[5]), float(y[4])))
但是,每当尝试显示结果时,我都会得到一个错误,这意味着我什至不确定我的结构是否正确。
计算每年的总和-这将需要我ReducebyKey(year)
...,因此大致如下:
reduceByKey(year)
但是,我得到了错误
NameError: name 'year' is not defined
对此有任何见识将不胜感激。
答案 0 :(得分:1)
最好使用数据框操作,因为您的数据已经结构化了……示例使用数据集进行汇总。
Public Class _Default
Inherits Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
If Not IsPostBack Then
Dim listCol As New ListItemCollection
listCol.Add(New ListItem(String.Empty, String.Empty))
listCol.Add(New ListItem("New Item", "640"))
listCol.Add(New ListItem("Another Item", "950"))
DropDownList1.DataSource = listCol
DropDownList1.DataBind()
End If
End Sub
Protected Sub DropDownList1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles DropDownList1.SelectedIndexChanged
Debug.Print(DropDownList1.SelectedValue)
Debug.Print(DropDownList1.SelectedItem.ToString)
End Sub
End Class
https://spark.apache.org/docs/latest/api/python/pyspark.sql.html
总体-DF是Spark的高级结构化API,具有与Pandas和R DF相似的架构/类型,而RDD是Spark的低级非结构化API,它们不具有架构,只是原始(Python,Scala,Java)对象字符串类型。基本上所有DF Spark代码都可以编译为RDD,而只是结构化的表格格式。