Spark中的第一个代码(python)

时间:2015-04-30 17:41:37

标签: apache-spark pyspark

我是Spark的新手并试图创造简单的东西。 我有一个包含2列的文件:日期和值。 对于每第6个日期,我想使用线性回归基于之前的5个值进行投影。 然后将其写入文件,并将实际值和投影值之间的误差写入第3列。

到目前为止,我有这个:

from pyspark import SparkContext, SparkConf
from datetime import datetime
from timeit import timeit

def after(line, date):
  current = line.split(';')[0]
  currentDate = datetime.strptime(current, '%Y.%m.%d')
  if currentDate > datetime.strptime(date, '%Y.%m.%d'):
    return True
  else:
    return False

def getValue(line):
  return float(line.split(';')[1])

conf = SparkConf().setAppName("test").setMaster("local")
sc = SparkContext(conf=conf)

data = sc.textFile('./AAPL.csv')

average = latest_data.reduce(lambda l1, l2: l1+l2)/latest_data.count()

printed_data = data.filter(lambda line: after(line, u'2015.03.27')).map(lambda d: [getValue(d), average, (getValue(d)-average)*(getValue(d)-average)])

printed_data.saveAsTextFile('./result.txt')

我的问题是我不知道如何在Spark中创建for循环类的东西。我的意思是,如果我有10台计算机来处理这个问题,我希望计算能够并行运行......

作为下一步,我只想获得result.txt文件中的错误总和。 (只有这一个数字。)

2 个答案:

答案 0 :(得分:0)

检查sc.parallelize看看你想要的是什么。

data = sc.textFile('./AAPL.csv')

您可能想要执行类似

的操作
distData = sc.parallelize(data)

distDAta = sc.parallelize(data, 10)  // say you want to split those 10 piece and run it ( regardless how your environment actually can though... )

答案 1 :(得分:0)

我假设您有兴趣通过使用spark来并行计算。因此,让RDD中的每个元素彼此独立是很重要的。将每六行/记录放入一个元素中非常重要。正如MadKing指出的那样,除了某些函数之外,没有必要使用任何循环,因为RDD的顺序是有保证的。我个人更喜欢使用RDD索引而不是#range()。

以下是将读取RDD转换为此类计算的伪代码。基本上,1)创建周#并将其用作聚合密钥以便以后聚合2)对来自RDD的单个元素的值进行线性回归。

首先读取文件,您需要编写自己的解析器函数,将csv的每一行拆分为日期和值的元组。并使用zipWithIndex()获取行号。

weekRDD = lineIndexRDD.map(lambda (date, value, lineNum):(lineNum/6, (date, value))).groupByKey()
# weekIndexRDD is now (week#, [(date1, value1),(date2, value2),...(date6, value6)])

接下来,将第#行映射到第#周,因此每6行具有相同的周数,按行号除以6,本周数可用于聚合。

lrRDD = weekRDD.map(myLinearRegression)
#your LinearRegression function should take a tuple of (week#, 6daysRecordsArray) and output a tuple of (week#, prediction, error, 6daysRecordsArray)
# lrRDD is now (week#, prediction, error, [(date1, value1),(date2, value2),...(date6, value6)])

现在你可以进行线性回归,因为RDD的每个元素,你需要编写自己的线性回归函数来计算输入数组中的值并返回预测和错误。

finalRDD = lrRDD
.flatMap(lambda(weekNum, prediction, error, [(d1, v1),(d2, v2),...(d6, v6)]):(d1, v1),(d2, v2),...(d5, v5),(d6, v6, prediction, error)
).saveAsTextFile(outputFile.name)
#don't forget to insert newline (\n) in between!

最后,您可以将RDD重新格式化为您想要的最终格式并将其写下来,下面非常冗长,但您可以为它编写辅助函数。我不确定你在第6个日期想要什么,所以请仔细检查一下。

public static implicit operator DataPair(string[] values)
{
    return new DataPair(values[0], values[1]);
}