1、cassandra 准备

启动cqlsh,

CQLSH_HOST=172.16.163.131 bin/cqlsh
cqlsh>CREATE KEYSPACE productlogs WITH REPLICATION = { 'class' : 'org.apache.cassandra.locator.SimpleStrategy', 'replication_factor': '2' } 

cqlsh>CREATE TABLE productlogs.logs (
ids uuid,
app_name text,
app_version text,
city text,
client_time timestamp,
country text,
created_at timestamp,
cs_count int,
device_id text,
id int,
modle_name text,
province text,
remote_ip text,
updated_at timestamp,
PRIMARY KEY (ids)
)

2、spark cassandra conector jar包

新建空项目,使用sbt,引入connector,打包为spark-cassandra-connector-full.jar,在*.sbt文件中添加如下一行

libraryDependencies += "com.datastax.spark" % "spark-cassandra-connector_2.10" % "1.5.0"

这步的意义在于:官方的connector包没有将依赖打进去,所以,直接使用官方包的时候,需要自己将依赖找出来。不同版本依赖的包及版本也不相同,简单起见,直接打一个full包

3、启动spark-shell

/opt/db/spark-1.5.2-bin-hadoop2.6/bin/spark-shell --master spark://u1:7077  --jars ~/spark-cassandra-connector-full.jar

以下为sparkshell 命令

4、准备数据源:

//可能大多数文档都先stop掉当前sc,再重启一个,其实根本没必要,直接在原有sc上添加cassandra的参数就好
scala>sc.getConf.set("spark.cassandra.connection.host", "172.16.163.131")
//读取HDFS上的数据源
scala>val df = sc.textFile("/data/logs")
//引入需要的命令空间
scala>import org.apache.spark.sql._
scala>import org.apache.spark.sql.types._
scala>import com.datastax.spark.connector._
scala>import java.util.UUID
//定义shcmea
scala>val schema = StructType(
StructField("ids", StringType, true) ::
StructField("id", IntegerType, true) ::
StructField("app_name", StringType, true) ::
StructField("app_version", StringType, true) ::
StructField("client_time", TimestampType, true) ::
StructField("device_id", StringType, true) ::
StructField("modle_name", StringType, true) ::
StructField("cs_count", IntegerType, true) ::
StructField("created_at", TimestampType, true) ::
StructField("updated_at", TimestampType, true) ::
StructField("remote_ip", StringType, true) ::
StructField("country", StringType, true) ::
StructField("province", StringType, true) ::
StructField("city", StringType, true) :: Nil)
//指定数据源的schema
scala>val rowRDD = df.map(_.split("\t")).map(p => Row(UUID.randomUUID().toString(), p(0).toInt, p(1), p(2), java.sql.Timestamp.valueOf(p(3)), p(4), p(5), p(6).toInt, java.sql.Timestamp.valueOf(p(7)), java.sql.Timestamp.valueOf(p(8)), p(9), p(10), p(11), p(12)))
scala>val df= sqlContext.createDataFrame(rowRDD, schema)
scala>df.registerTempTable("logs")
//看下结果
scala>sqlContext.sql("select * from logs limit 1").show

如果你足够细心的话,你可能看到在类型为uuid的ids列,我用的是字符串UUID.randomUUID().toString()。为什么呢?其实在spark cassandra connector内部,会进行转换的。见附录1

5、将数据存入cassandra

scala>import org.apache.spark.sql.cassandra._
scala>df.write.format("org.apache.spark.sql.cassandra").options(Map("table" -> "logs", "keyspace" -> "productlogs")).save()

6、取出刚存的数据:

scala>import org.apache.spark.sql.cassandra._
scala>val cdf = sqlContext.read.
format("org.apache.spark.sql.cassandra").
options(Map("table" -> "logs", "keyspace" -> "productlogs")).
load().registerTempTable("logs")
scala>sqlContext.sql("select * from logs_jsut_save limit 1").show

7、cassandra 与spark sql 数据类型对应关系

spark-cassandra-connector/spark-cassandra-connector/src/main/scala/org/apache/spark/sql/cassandra/DataTypeConverter.scala

  private[cassandra] val primitiveTypeMap = Map[connector.types.ColumnType[_], catalystTypes.DataType](
connector.types.TextType -> catalystTypes.StringType,
connector.types.AsciiType -> catalystTypes.StringType,
connector.types.VarCharType -> catalystTypes.StringType, connector.types.BooleanType -> catalystTypes.BooleanType, connector.types.IntType -> catalystTypes.IntegerType,
connector.types.BigIntType -> catalystTypes.LongType,
connector.types.CounterType -> catalystTypes.LongType,
connector.types.FloatType -> catalystTypes.FloatType,
connector.types.DoubleType -> catalystTypes.DoubleType,
connector.types.SmallIntType -> catalystTypes.ShortType,
connector.types.TinyIntType -> catalystTypes.ByteType, connector.types.VarIntType -> catalystTypes.DecimalType(38, 0), // no native arbitrary-size integer type
connector.types.DecimalType -> catalystTypes.DecimalType(38, 18), connector.types.TimestampType -> catalystTypes.TimestampType,
connector.types.InetType -> catalystTypes.StringType,
connector.types.UUIDType -> catalystTypes.StringType,
connector.types.TimeUUIDType -> catalystTypes.StringType,
connector.types.BlobType -> catalystTypes.BinaryType,
connector.types.DateType -> catalystTypes.DateType,
connector.types.TimeType -> catalystTypes.LongType
)

备注:作者在spark-shell下,使用spark-cassandra-conector 主要使用了两个技巧

1、新建空项目,引入spark-cassandra-conector,将依赖包打进来

2、在spark-shell,直接获取conf,然后添加cassandra 连接参数,这样,就可以在默认的sparkcontext、sqlContext:HiveContext上使用,而不需要先sc.stop

cassandra 之 在spark-shell 中使用 spark cassandra connector 完整案例的更多相关文章

  1. 在Spark shell中基于HDFS文件系统进行wordcount交互式分析

    Spark是一个分布式内存计算框架,可部署在YARN或者MESOS管理的分布式系统中(Fully Distributed),也可以以Pseudo Distributed方式部署在单个机器上面,还可以以 ...

  2. 在Spark shell中基于Alluxio进行wordcount交互式分析

    Spark是一个分布式内存计算框架,可部署在YARN或者MESOS管理的分布式系统中(Fully Distributed),也可以以Pseudo Distributed方式部署在单个机器上面,还可以以 ...

  3. zeppelin中运行spark streaming kakfa & 实时可视化

    notebook方式运行spark程序是一种比较agile的方式,一方面可以体验像spark-shell那样repl的便捷,同时可以借助notebook的作图能力实现快速数据可视化,非常方便快速验证和 ...

  4. Spark Shell简单使用

    基础 Spark的shell作为一个强大的交互式数据分析工具,提供了一个简单的方式学习API.它可以使用Scala(在Java虚拟机上运行现有的Java库的一个很好方式)或Python.在Spark目 ...

  5. Spark学习进度-Spark环境搭建&Spark shell

    Spark环境搭建 下载包 所需Spark包:我选择的是2.2.0的对应Hadoop2.7版本的,下载地址:https://archive.apache.org/dist/spark/spark-2. ...

  6. 【原创 Hadoop&Spark 动手实践 5】Spark 基础入门,集群搭建以及Spark Shell

    Spark 基础入门,集群搭建以及Spark Shell 主要借助Spark基础的PPT,再加上实际的动手操作来加强概念的理解和实践. Spark 安装部署 理论已经了解的差不多了,接下来是实际动手实 ...

  7. Spark(一)Spark简介

    一.官网介绍 1 什么是Spark 官网地址:http://spark.apache.org/ Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎.Spark是UC Berkel ...

  8. [转] Spark快速入门指南 – Spark安装与基础使用

    [From] https://blog.csdn.net/w405722907/article/details/77943331 Spark快速入门指南 – Spark安装与基础使用 2017年09月 ...

  9. 大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

    0.前言 0.1  分布式运算框架的核心思想(此处以MR运行在yarn上为例)  提交job时,resourcemanager(图中写成了master)会根据数据的量以及工作的复杂度,解析工作量,从而 ...

随机推荐

  1. Error-The content of element type "web-app" must match "(icon?,display-

    错误描述 The content of element type "web-app" must match "(icon?,display- name?,descript ...

  2. OCR技术浅探:特征提取(1)

    研究背景 关于光学字符识别(Optical Character Recognition, 下面都简称OCR),是指将图像上的文字转化为计算机可编辑的文字内容,众多的研究人员对相关的技术研究已久,也有不 ...

  3. 生信-序列比较dp[未完成]

    来自:生物信息学-陈铭第二版的一个例题. 题目: 目前的代码,运行不正确,关键就是不知道怎么回溯啊,回溯怎么标记呢? #include <iostream> #include<vec ...

  4. Spring框架第三篇之基于XML的DI注入

    一.注入分类 Bean实例在调用无参构造器创建空值对象后,就要对Bean对象的属性进行初始化.初始化是由容器自动完成的,称为注入.根据注入方式的不同,常用的有两类:设值注入.构造注入.实现特定接口注入 ...

  5. python3 对excel读、写、修改的操作

    一.对excel的写操作实例: 将一个列表的数据写入excel, 第一行是标题,下面行数具体的数据 import xlwt #只能写不能读 stus = [['姓名', '年龄', '性别', '分数 ...

  6. SqlServer中创建Oracle链接服务器

    SqlServer中创建Oracle链接服务器 第一种:界面操作 (1)展开服务器对象-->链接服务器-->右击“新建链接服务器” (2)输入链接服务器的IP (3)链接成功后 第二种:语 ...

  7. PKU 1204 Word Puzzles(AC自动机)

    题目大意:原题链接 给定一个字符串矩阵和待查找的单词,可以朝8个不同的方向查找,输出待查找单词第一个字母在矩阵中出现的位置和该单词被查到的方向. A~H代表8个不同的方向,A代表正北方向,其他依次以4 ...

  8. 在Idea中连接数据库并生成实体类(mybatis逆向生成实体类)

    1.连接数据库 (1)按下图 ,  点击view-----选择tool windows----------选择database并点击 (2)弹出Database窗口 点击加号------------选 ...

  9. Redis学习笔记之Redis中5种数据结构的使用场景介绍

    原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 redis 中一共有5种数据结构 ...

  10. OpenStack之Nova模块

    Nova简介 nova和swift是openstack最早的两个组件,nova分为控制节点和计算节点,计算节点通过nova computer进行虚拟机创建,通过libvirt调用kvm创建虚拟机,no ...