大数据项目(MTDAP)随想

Spark MLlib进行example测试的时候,总是编译不通过,报少包<Spark MLlib NoClassDefFoundError: org/apache/spark/ml/param/Param>,但是代码没有报错,也能够跳转过去,我重新Maven刷过,程序还是启不来。后来观察到pom.xml中mllib是‘provided’的,去掉就好了。  

原因就是provided是表示所在容器是包含这个包的,只会作用在编译、测试阶段;而默认的compile则是在编译、测试、运行阶段都需要的。

多动脑筋哈,乐趣就在其中。

<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_2.10</artifactId>
            <version>2.1.0</version>
           <scope>provided</scope>
 </dependency>

 

/***********************************************************************************************/

IDEA下maven package打包报错,说某个jar包找不到或者什么not found: type、error: object xxx is not a member of package ... 一般这个jar包不是你通过maven关系管理的,或者是idea直接Libraries下from maven关联的,改用pom.xml文件引用可解决,反复试几次。本质原因不明.

/***********************************************************************************************/

Scala下JSON、Map、String的转换

1、使用astjson,使用与java相同的方式即可,甚至可以先在 .class文件中写好代码再复制到 .scala文件中,IDEA会自动帮人转换

     期间 JSON.toJSONString(map) 出现错误:ambiguous reference to overloaded definition when call method in java library。 这是因为方法重载什么的,

     必须明确确定参数个数改为JSON.toJSONString(map, SerializerFeature.PrettyFormat)

2、使用net.minidev.json

  

import net.minidev.json.JSONObject
import net.minidev.json.parser.JSONParser

/*****生成JSONObject,赋值,并转成String************/
 val obj: JSONObject = new JSONObject
        obj.put("road_id",road_id)
        obj.put("bpoint_id",bpoint_id)
        obj.put("epoint_id",epoint_id)
 val jsonStr = obj.toJSONString

/*****解析Json字符串************/
 val jsonParser =new JSONParser()
 val result: JSONObject = 
     jsonParser.parse(opt.get).asInstanceOf[JSONObject]
 result.get("road_id")

 

两种都可以吧,坑爹的是使用JSON过程中我遇到一个错误:com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.5.6 error

这个错误让我肯定以为是Spark中的Jackson与Json jar包中的Jackson产生冲突,然后我就把Json相关的代码全部删除,可一直报错,我都不敢肯定是否是fastJson的问题,我把fastJson的jar删除以后还是报错,哈哈哈,现在写博客的时候我终于找到原因了,原来是我没通过Maven管理的jar包中有smart-json-1.1.1,就是华为提供的FusionInsight相关的jar,然后我又从外界引用了smart-json-2.6。欸,所以以后最好都是用maven统一管理jar最好了。遇到问题多用脑子思考为什么,本质总是那么多,思考最核心的本质与原理。就像这个错误,是jar包冲突几乎肯定,那是哪几个包冲突呢,百度后不符合所我的需求,就可以再想想会不会是自己json引用过多冲突呢,多动脑子啊!多思考最本质的原理。

/***********************************************************************************************/

Scala和Java中的Infinity和NaN。

今天SparkStreaming处理数据进行reduce(_+_)相加的时候,发现有的结果是正确的数字,有的却是Infinity,无穷大,进一步打印<reduce((x, y) => println(x+y); x+y)> 发现会突然出现某个Infinity,然后后续一直都Infinity,之前的操作中有除法,也有赋值为0的情况,我想可能是num/0导致无穷大了,最本质的解决方法当然是去排除分母为0的情况,最快的解决方法是利用Double.isInfinity()方法来filter,而且Float包装类中是没有这个方法的。   随便说说NaN,这个常出现在JS中==判断的时候,比如a==1,当a不是数字的时候就会报NaN,Not a Number。

 

/***********************************************************************************************/

移动一行代码

  1. 将插入符号放在要移动的行上。
  2. 执行以下操作之一:
    • 在主菜单上选择  代码| 向上移动(Code | Move Line Up)或 代码| 向下移动(Code | Move Line Down)。
    • 按 Shift+Alt+Up 或 Shift+Alt+Down。

 

 Maven仓库配置的时候本地是有密码的,需要配置进去(Server),实在报某些包找不到就直接手动添加

/***********************************************************************************************/

redis上传数据报错maxmemory:

当我将两千多万条数据,以一个Hash形式上传数据的时候报内存溢出,公司集群分配给Redis的内存是默认的1G,偏少,但是我的模式应该也有问题,我为了便于管理key,所有的同类型字典数据都使用一个key,比如

通过field进行精确查询。我觉得数据量总的来说没有达到临界值,但是redis是以一条key一条key这样上传的,所以一个key的数据量如此之大,估计因此吃不消了。

 

/***********************************************************************************************/

 

 

/***********************************************************************************************/

 

/***********************************************************************************************/

Map.Entry的作用(减少遍历map的次数)

3.由此便产生了遍历Map的两种方法:
3.1通过键的集合 间接遍历 map
Set<K> set = map.keySet();//先遍历map,取出所有的键。对map的第一次遍历。
Iterator it = set.iterator();//由此可以看出,这个方法实际是通过遍历键的集合来间接遍历map
while(it.hasnext()){
Object key = it.next();
Object value = map.get(key);//对map的第二次遍历。注意:getKey(key)也是需要通过传入的参数与所有的key一个一个的进行比较,直到找到Otherkey.equals(key)为true的OtherKey
...//当然,还得需要强转一下才能投入实际使用 
}
3.2通过(Entry类的对象)组成的集合 间接遍历map
Set<Map.Entry<K,V>> set = map.entrySet();//遍历一次map,将所有的键值对一块取出。
Iterator it = set.iterator();
while(it.hasnext()){
Object key = it.getKey();
Object value = it.getValue();
...//当然,也得需要强转 
}
两种遍历方法的比较:
3.1 与 3.2只是效率上的区别,由上面的注释就可以看出:
3.1对map进行了两次遍历。
3.2对map进行了一次遍历。

/***********************************************************************************************/

Redis中一个Hash可以存储40亿,Every hash can store up to 2^32 - 1 field-value pairs (more than 4 billion).《摘自Redis官网的Data type章节,意思是内存允许的情况下,可以存超过40亿数据》

 /***********************************************************************************************/

Q:HBase和Solr的不同

hbase 是一个多元KV列存储数据库,可以快速读写,写性能尤为出色,这是一种基于MVCC的方案;

solr是基于lucene的企业级数据索引解决方案,但写入性能跟hbase比起来差个量级。所以一般用hbase存数据,solr作二级索引。

HBase可以通过协处理器Coprocessor的方式向Solr发出请求,Solr对于接收到的数据可以做相关的同步:增、删、改索引的操作,这样就可以同时使用HBase存储量大和Solr检索性能高的优点了,更何况HBase和Solr都可以集群。这对海量数据存储、检索提供了一种方式,将存储与索引放在不同的机器上,是大数据架构的必须品。

 

Q:HBase和Redis的不同

两个不能互相替代,只能互相弥补,redis是基于内存的,而hbase基于hdfs

1、hbase:可以存储上亿的数据,适合存储大数据,可以基于rowkey扫描数据,作为大数据存储数据库的不错选择

 2、redis:基于内存的,速度比hbase快,但是不能作为大数据存储,但是适合一些批量数据,快速读取,作为临时数据缓存的不错选择。

以上答案来自网络。

/***********************************************************************************************/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值