使用Pyspark命名变量

时间:2015-09-30 11:27:04

标签: python apache-spark pyspark

即使我的问题很简单,因为我是新手来解决它的问题。

我的问题的正常python查询如下:

public partial class ResultClass
    {
     public string Name {get;set;}
     public int OrderId {get;set;}
     public double TotalPrice {get;set;}
    }

public List<ResultClass>  GetProductSalesInfoById(int id)
 {
     var query = from product in database.Products
         join sales in database.SalesOrderDetails
             on product.ProductID equals sales.ProductID
         select new ResultClass {Name = product.Name,OrderId = sales.SalesOrderID,TotalPrice = (sales.UnitPriceDiscount)*sales.OrderQty*sales.UnitPrice};


     return result.ToList();
 } 

我可以将文件读作

for line in file('schedule.txt'):
  origin,dest,depart,arrive,price=line.split(',')

但是当我尝试以下代码时:

sched=sc.textFile('/PATH/schedule.txt')

我收到此错误:

  origin,dest,depart,arrive,price=sched.split(',')

我可以使用lambda函数拆分文件。但是不知道如何创建这5个变量名。

如果有人可以帮助我。

1 个答案:

答案 0 :(得分:2)

sched=sc.textFile('/PATH/schedule.txt')返回RDD,它是一个与python文件对象不同的数据类型,并支持不同的API。你的python代码的等价物将是:

sched=sc.textFile('/PATH/schedule.txt')
# extract values
vals = sched.map(lambda line:line.split(','))
# now you can do some processing, for example sum price
price = vals.reduce(lambda v1,v2:v1[4]+v2[4])
# or just collect the raw values
raw_vals = vals.collect()

<强>更新 如果您希望能够将每行的值作为局部变量访问,则可以定义专用函数而不仅仅是lambda并将其传递给.map()

def process_line(line):
    origin,dest,depart,arrive,price=line.split(',')
    # do whatever
    # remember to return a result

sche.map(process_line)

<强> UPDATE2:

您要对文件执行的特定处理并不简单,因为它需要写入共享变量(flights)。相反,我建议按orig,dest对行进行分组,然后收集结果并插入字典:

flights_data = sched.map(lambda line: ((line[0],line[1]),tuple(line[2:]))).groupByKey().collect()
flights = {f:ds for f,ds in flights_data}