即使我的问题很简单,因为我是新手来解决它的问题。
我的问题的正常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个变量名。
如果有人可以帮助我。
答案 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}