zoukankan      html  css  js  c++  java
  • 基于spark实现表的join操作

    1. 自连接

    假设存在如下文件:

    [root@bluejoe0 ~]# cat categories.csv 
    1,生活用品,0
    2,数码用品,1
    3,手机,2
    4,华为Mate7,3

    每一行的格式为:类别ID,类别名称,父类ID

    现在欲输出每个类别的父类别的名称,类似于SQL的自连接,注意到join的外键其实是父类ID

    首先生成“父类ID->子类ID,子类名称”

    val categories=sc.textFile("/root/categories.csv")
    
    val left = categories.map(_.split(",")).map(x=>(x(2)->Map("id"->x(0),"name"->x(1))))

    left的内容为:

    Array((0,Map(id -> 1, name -> 生活用品)), (1,Map(id -> 2, name -> 数码用品)), (2,Map(id -> 3, name -> 手机)), (3,Map(id -> 4, name -> 华为Mate7)))

    接着生成“父类ID->父类ID,父类名称”

    val right = categories.map(_.split(",")).map(x=>(x(0)->Map("pid"->x(0),"pname"->x(1))))

    right的内容为:

    Array((1,Map(pid -> 1, pname -> 生活用品)), (2,Map(pid -> 2, pname -> 数码用品)), (3,Map(pid -> 3, pname -> 手机)), (4,Map(pid -> 4, pname -> 华为Mate7)))

    接下来,将这两个RDD进行合并,并按照key(key都是父类ID)进行reduce:

    val merged = (left++right).reduceByKey(_++_)

    merged的内容为:

    Array((4,Map(pid -> 4, pname -> 华为Mate7)), (0,Map(id -> 1, name -> 生活用品)), (1,Map(id -> 2, name -> 数码用品, pid -> 1, pname -> 生活用品)), (2,Map(id -> 3, name -> 手机, pid -> 2, pname -> 数码用品)), (3,Map(id -> 4, name -> 华为Mate7, pid -> 3, pname -> 手机)))

    搞定!!

    可以采用flatMap来简化以上的写法:

    val merged = categories.map(_.split(",")).flatMap((x)=>Array(x(2)->Map("id"->x(0),"name"->x(1)), x(0)->Map("pid"->x(0),"pname"->x(1)))).reduceByKey(_++_)

    结果是一样一样的!!当然代码的可读性大打折扣了~~~

    2. 两张表连接

  • 相关阅读:
    分页查询
    matlab 常用机器学习算法的实现
    powerpoint(ppt) 的制作
    powerpoint(ppt) 的制作
    libsvm 的使用
    libsvm 的使用
    TFRecord —— tensorflow 下的统一数据存储格式
    numpy 数据类型与 Python 原生数据类型
    numpy 数据类型与 Python 原生数据类型
    Python str 与 bytes 类型(Python2/3 对 str 的处理)
  • 原文地址:https://www.cnblogs.com/bluejoe/p/5115835.html
Copyright © 2011-2022 走看看