spark:仿写案例--32

1.Cassandra:测试Cassandra数据库,Cassandra是由Facebook开发后再开源的

//

package llf

import java.nio.ByteBuffer

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
import scala.collection.immutable.Map

import org.apache.cassandra.hadoop.ConfigHelper
import org.apache.cassandra.hadoop.cql3.CqlPagingInputFormat
import org.apache.cassandra.hadoop.cql3.CqlConfigHelper
import org.apache.cassandra.hadoop.cql3.CqlOutputFormat
import org.apache.cassandra.utils.ByteBufferUtil
import org.apache.hadoop.mapreduce.Job

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.SparkContext._

/**
 * Created by sendoh on 2015/4/23.
 */
//介绍了通过Spark读取Cassandra数据并进行处理
object CassandraCQLTest {  //Cassandra是一套开源分布式NoSQL数据库系统。
  def main(args: Array[String]): Unit ={
    val conf = new SparkConf().setAppName("CassandrsCQLTest")
    val sc = new SparkContext(conf)
    val cHost: String = args(0) //将cHost定义为String类型,将初始化的第一个参数负值给它
    val cPort: String = args(1)
    val KeySpace = "retial"
    val InputColumnFamily = "ordercf"
    val OutputColumnFamily = "salecount"
    val job = new Job()// 新建一个Hadoop job。因为Spark是没有提供直接的API访问Cassandra,但是Spark是建于Hadoop之上,
                         // Cassandra提供了访问Hadoop的接口所以我们需要先创建一个Hadoop的job来连接它两。
    job.setInputFormatClass(classOf[CqlPagingInputFormat]) //设置input的类,这个没有什么其他可选项,这是Cassandra默认的jar包中提供的接口。
    ConfigHeloper.setInputInitialAddress(job,getConfiguration(), cHost)//ConfigHelper类用来读取web.config配置的数据
  //通过Cassandra提供的静态类ConfigHelper来设置相对应的一些参数。
    ConfigHelper.setInputRpcPort(job.getConfiguration(), cPort)
    ConfigHelper.setInputColumnFamily(job.getConfiguration(), KeySpace, InputColumnFamily)
    ConfigHelper.setInputPartitioner(job.getConfiguration(), "Murmur3Partitioner")
    CqlConfigHelper.setInputCQLPageRowSize(job.getConfiguration(), "3")
    val query = "UPDATE " + KeySpace + "." + OutputColumnFamily + " SET sale_count = ? "
    CqlConfigHelper.setOutputCql(job.getConfiguration(), query)
    job.setOutputFormatClass(classOf[CqlOutputFormat])
    ConfigHelper.setOutputColumnFamily(job.getConfiguration(), KeySpace, OutputColumnFamily)
    ConfigHelper.setOutputInitialAddress(job.getConfiguration(), cHost)
    ConfigHelper.setOutputRpcPort(job.getConfiguration(), cPort)
    ConfigHelper.setOutputPartitioner(job.getConfiguration(), "Murmur3Partitioner")
//可以看到这里创建了一个RDD对象,第一个参数就是将之间我们配置好的参数,第二个就是之前提到的Cassandra提供的接口,
// 第三和第四个参数其他没有其他的可选项,这两个参数是被ColumnFamilyInputFormat所限制的。这个其实大家看SparkAPI就能了解到
    val casRdd = sc.newAPIHadoopRDD(job.getConfiguration(),
      classOf[CqlPagingInputFormat],
      classOf[java.util.Map[String,ByteBuffer]],
      classOf[java.util.Map[String,ByteBuffer]])

    println("Count: " + casRdd.count)
  //这里就是运行mapper方法了,就和hadoop中的mapper一个概念。需要说明的是,这里的key就是一个ByteBuffer对象,
  //  value就是一个SortedMap[ByteBuffer, IColumn],这两个就是之前创建RDD设置的最后两个参数
    val productSaleRDD = casRdd.map {
      case (key, value) => {
        (ByteBufferUtil.string(value.get("prod_id")), ByteBufferUtil.toInt(value.get("quantity")))
      }
    }
    val aggregatedRDD = productSaleRDD.reduceByKey(_ + _)
    aggregatedRDD.collect().foreach {
      case (productId, saleCount) => println(productId + ":" + saleCount)
    }

    val casoutputCF  = aggregatedRDD.map {
      case (productId, saleCount) => {
        val outColFamKey = Map("prod_id" -> ByteBufferUtil.bytes(productId))
        val outKey: java.util.Map[String, ByteBuffer] = outColFamKey
        var outColFamVal = new ListBuffer[ByteBuffer]
        outColFamVal += ByteBufferUtil.bytes(saleCount)
        val outVal: java.util.List[ByteBuffer] = outColFamVal
        (outKey, outVal)
      }
    }

    casoutputCF.saveAsNewAPIHadoopFile(
      KeySpace,
      classOf[java.util.Map[String, ByteBuffer]],
      classOf[java.util.List[ByteBuffer]],
      classOf[CqlOutputFormat],
      job.getConfiguration()
    )

    sc.stop()
  }

}
//

//

package llf

import org.apache.hadoop.mapreduce.Job
import org.apache.spark.{SparkContext, SparkConf}

/**
 * Created by sendoh on 2015/4/25.
 */
object CassandraTest {//Cassandra是一套开源分布式NoSQL数据库系统。
  def main(args: Array[String]): Unit ={
    val conf = new SparkConf().setAppName("CassandraTest").setMaster("local[2]")
    val sc = new SparkContext(conf)
    val job = new Job()// 新建一个Hadoop job。因为Spark是没有提供直接的API访问Cassandra,但是Spark是建于Hadoop之上,
  // Cassandra提供了访问Hadoop的接口所以我们需要先创建一个Hadoop的job来连接它两。
    job.setInputFormatClass(classOf[ColumnFamilyInputFormat]) //设置input的类,这个没有什么其他可选项,这是Cassandra默认的jar包中提供的接口。
    val host: String = args(1)//将host定义为String类型,将初始化的第一个参数负值给它
    val port: String = args(2)
    ConfigHelper.setInputIntitalAddress(job.getConfiguration(), host)//ConfigHelper类用来读取web.config配置的数据
  //通过Cassandra提供的静态类ConfigHelper来设置相对应的一些参数。
    ConfigHelper.setInputRpcport(job.getConfiguration, port)
    ConfigHelper.setOutputIntitalAddress(job.getConfiguration(), host)
    ConfigHelper.setOutputRpcport(job.getConfiguration(), port)
    ConfigHelper.setInputColumnFamily(job.getConfiguration(), "casDemo", "Words")
    ConfigHelper.setOutputColumnFamily(job.getConfiguration(), "casDemo", "WordCount")

    val predicate = new SlicePredicate()
    val sliceRange = new SliceRange()
    sliceRange.setStart(Array.empty[Byte])
    sliceRange.setFinish(Array.empty[Byte])
    predicate.setSlice_range(sliceRange)
    ConfigHelper.setInputSlicePredicate(job.getConfiguration(), predicate)

    ConfigHelper.setInputPartitioner(job.getConfiguration(), "Murmur3Partitioner")
    ConfigHelper.setOutputPartitioner(job.getConfiguration(), "Murmur3Partitioner")
    // Make a new Hadoop RDD
  //可以看到这里创建了一个RDD对象,第一个参数就是将之间我们配置好的参数,第二个就是之前提到的Cassandra提供的接口,
  // 第三和第四个参数其他没有其他的可选项,这两个参数是被ColumnFamilyInputFormat所限制的。这个其实大家看SparkAPI就能了解到
  val casRdd = sc.newAPIHadoopRDD(
      job.getConfiguration(),
      classOf[ColumnFamilyInputFormat],
      classOf[ByteBuffer],
      classOf[SortedMap[ByteBuffer, IColumn]])

    // Let us first get all the paragraphs from the retrieved rows
    //这里就是运行mapper方法了,就和hadoop中的mapper一个概念。需要说明的是,这里的key就是一个ByteBuffer对象,
    //  value就是一个SortedMap[ByteBuffer, IColumn],这两个就是之前创建RDD设置的最后两个参数
    val paraRdd = casRdd.map {
      case (key, value) => {
        ByteBufferUtil.string(value.get(ByteBufferUtil.bytes("para")).value())
      }
    }

    // Lets get the word count in paras
    val counts = paraRdd.flatMap(p => p.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)

    counts.collect().foreach {
      case (word, count) => println(word + ":" + count)
    }

    counts.map {
      case (word, count) => {
        val colWord = new org.apache.cassandra.thrift.Column()
        colWord.setName(ByteBufferUtil.bytes("word"))
        colWord.setValue(ByteBufferUtil.bytes(word))
        colWord.setTimestamp(System.currentTimeMillis)

        val colCount = new org.apache.cassandra.thrift.Column()
        colCount.setName(ByteBufferUtil.bytes("wcount"))
        colCount.setValue(ByteBufferUtil.bytes(count.toLong))
        colCount.setTimestamp(System.currentTimeMillis)

        val outputkey = ByteBufferUtil.bytes(word + "-COUNT-" + System.currentTimeMillis)

        val mutations: java.util.List[Mutation] = new Mutation() :: new Mutation() :: Nil
        mutations.get(0).setColumn_or_supercolumn(new ColumnOrSuperColumn())
        mutations.get(0).column_or_supercolumn.setColumn(colWord)
        mutations.get(1).setColumn_or_supercolumn(new ColumnOrSuperColumn())
        mutations.get(1).column_or_supercolumn.setColumn(colCount)
        (outputkey, mutations)
      }
    }.saveAsNewAPIHadoopFile("casDemo", classOf[ByteBuffer], classOf[List[Mutation]],
        classOf[ColumnFamilyOutputFormat], job.getConfiguration)

    sc.stop()
  }

}
///

初学spark,这两个例子我还没有完全看懂,欢迎交流,QQ:1217111493

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值