String对象的内存分析

Java中内存分析:

  栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。

  堆(heap):存放所有new出来的对象。

  常量池(constant pool):在堆中分配出来的一块存储区域,存储显式的String常量和基本类型常量(float、int等)。另外,可以存储不经常改变的东西(public static final)。常量池中的数据可以共享。

  静态存储:存放静态成员(static定义的)。

  

1)

1
2
  String a = "abc";①  
  String b = "abc";②

  分析:
  ①代码执行后在常量池(constant pool)中创建了一个值为abc的String对象,②执行时,因为常量池中存在”abc”所以就不再创建新的String对象了。

2)

1
2
  String   c   =   new   String("xyz");①  
  String d = new String("xyz");②

  分析:①Class被加载时,”xyz”被作为常量读入,在常量池(constant pool)里创建了一个共享的值为”xyz”的String对象;然后当调用到new String(“xyz”)的时候,会在堆(heap)里创建这个new String(“xyz”)对象;②由于常量池(constant pool)中存在”xyz”所以不再创建”xyz”,然后创建新的new String(“xyz”)。
3)

1
2
3
4
5
  String   s1   =   new   String("xyz");     //创建二个对象(常量池和堆中),一个引用   
  String s2 = new String("xyz"); //创建一个对象(堆中),并且以后每执行一次创建一个对象,一个引用

  String s3 = "xyz"; //创建一个对象(常量池中),一个引用
  String s4 = "xyz"; //不创建对象(共享上次常量池中的数据),只是创建一个新的引用

4)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class TestStr {   
public static void main(String\[\] args) {
// 以下两条语句创建了1个对象。"凤山"存储在字符串常量池中
String str1 = "凤山";
String str2 = "凤山";
System.out.println(str1==str2);//true
//以下两条语句创建了3个对象。"天峨",存储在字符串常量池中,两个new String()对象存储在堆内存中
String str3 = new String("天峨");
String str4 = new String("天峨");
System.out.println(str3==str4);//false
//以下两条语句创建了1个对象。9是存储在栈内存中
int i = 9;
int j = 9;
System.out.println(i==j);//true
//由于没有了装箱,以下两条语句创建了2个对象。两个1对象存储在堆内存中
Integer l1 = new Integer(1);
Integer k1 = new Integer(1);
System.out.println(l1==k1);//false

  //以下两条语句创建了1个对象。1对象存储在栈内存中。自动装箱时对于值从1到127之间的值,使用一个实例。
Integer l = 20;//装箱
Integer k = 20;//装箱
System.out.println(l==k);//true

//以下两条语句创建了2个对象。i1,i2变量存储在栈内存中,两个256对象存储在堆内存中
Integer i1 = 256;
Integer i2 = 256;
System.out.println(i1==i2);//false
}
}

参考 https://www.cnblogs.com/devinzhang/archive/2012/01/25/2329463.html

数据仓库——事实表、维度表、聚合表

事实表

在多维数据仓库中,保存度量值的详细值或事实的表称为“事实表”。一个按照州、产品和月份划分的销售量和销售额存储的事实表有5个列,概念上与下面的示例类似。

Sate Product Mouth Units Dollars
WA Mountain-100 January 3 7.95
WA CableLock January 4 7.32
OR Mountain-100 January 3 7.95
OR CableLock January 4 7.32
WA Mountain-100 February 16 42.40

在这些事实表的示例数据行中,前3个列——州、产品和月份——为键值列。剩下的两个列——销售额和销售量——为度量值。事实表中的每个列通常要么是键值列,要么是度量值列,但也可能包含其他参考目的的列——例如采购订单号或者发票号。

Read More

Markdown常用语法规则

基础书写格式

段落

在 Markdown 中,连续的一行或多行就是一个段落。用空行来进行切段。

  1. 这是第一个段落
  2. 我跟上面是同一个段落

  3. 这是第二个段落

大纲

Markdown 中,使用 # 来定义大纲标题,有多少个 #,就表示是几级的大纲。比如:

  1. # 这是一级标题(会生成<h1>标签)

  2. 这里是段落内容

  3. ## 这里是二级标题(会生成<h2>标签)

  4. 这里是段落内容

  5. ...

  6. ###### 这里是六级标题

这种书写方式非常直观自然。

Read More

Sqoop Oracle java.sql.SQLRecoverableException: IO 错误: Connection Reset

最近使用Sqoop将Oracle中的数据导入到Hive的时候总是出现如下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
18/09/28 09:44:53 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6-cdh5.11.0
18/09/28 09:44:53 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
18/09/28 09:44:53 INFO tool.BaseSqoopTool: Using Hive-specific delimiters for output. You can override
18/09/28 09:44:53 INFO tool.BaseSqoopTool: delimiters with --fields-terminated-by, etc.
18/09/28 09:44:53 INFO oracle.OraOopManagerFactory: Data Connector for Oracle and Hadoop is disabled.
18/09/28 09:44:53 INFO manager.SqlManager: Using default fetchSize of 1000
18/09/28 09:44:53 INFO tool.CodeGenTool: Beginning code generation
18/09/28 09:46:20 ERROR manager.SqlManager: Error executing statement: java.sql.SQLRecoverableException: IO 错误: Connection reset
java.sql.SQLRecoverableException: IO 错误: Connection reset
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:467)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)
at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
... 25 more
18/09/28 09:46:20 ERROR tool.ImportTool: Import failed: java.io.IOException: No columns to generate for ClassWriter
at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1664)
...

今天终于解决了。

1
2
3
export HADOOP_OPTS=-Djava.security.egd=file:/dev/../dev/urandom

sqoop import -D mapred.child.java.opts="-Djava.security.egd=file:/dev/../dev/urandom"

先在命令行设置HADOOP_OPTS,然后再执行sqoop import就可以了,根据我的测试结果,最好加上mapred.child.java.opts参数,并且在第二次导入的时候一定要加上--hive-overwrite参数。
注:有时候-m需要设置成1才可以。刚开始我将-m设置成2报错,我设置成1就可以了。

在脚本中export…和sqoop import -D mapred.child.java.opts都是不能少的。

This problem occurs primarily due to the lack of a fast random number generation device on the host where the map tasks execute.

参考 https://community.hortonworks.com/questions/57497/sqoop-from-oracle-connection-reset-error.html

Excel解析工具easyexcel

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。

Read More

子网掩码怎么理解?

从前有一个地主,有256间房子,地主家的门牌号码是“192.168.1”,那么他家第一间房子的门牌号码是192.168.1.0,第二间是192.168.1.1,…第256间的编号是192.168.1.255。

地主老了,需要把256间房子分给4个儿子,平均分配,每个儿子可以分64间。

请来一位先生主持公道,先生这么来操作:
192.168.1.0-192.168.1.63 分给大儿子
192.168.1.64-192.168.1.127 分给二儿子
192.168.1.128 -192.168.1.191 分给三儿子
192.168.1.192-192.168.1.255 分给四儿子

那如何来描述四个儿子的子网网段呢?
192.168.1.0/26
192.168.1.64/26
192.168.1.128/26
192.168.1.192/26

/26是什么鬼?
255.255.255.192的二进制是多少? “11111111-11111111-11111111-11”大家数数一共多少个1?不用数了,是26个1,为了简化子网掩码的表示,用/26代替255.255.255.192。

按位与运算
我们来看大儿子的网段192.168.1.0/26是如何得到的?

以大儿子的房间为例:
192.168.1.0-192.168.1.63

二进制表示:
192.168.1.0

11000000.10101000.00000001.00000000

192.168.1.63

11000000.10101000.00000001.00111111

首尾地址完全相同的是多少?
11000000.10101000.00000001.00

数数一共多少位?26位!那么用这个“192.168.1.0/26”就可以表示大儿子所有房间。

对照房间的门牌号码“192.168.1.199”,很显然属于四儿子的。

一个主机192.168.1.199/26 能否和直连主机192.168.1.200/24 通信?可以的因为都是四儿子的房间。

一个主机192.168.1.199/26 能否和直连主机
192.168.1.1/24 通信? 不可以因为一个是大儿子的房间,一个是四儿子的房间,无法直连通信!

From https://www.zhihu.com/question/56895036/answer/150953183 https://help.aliyun.com/knowledge_detail/40612.html

HIVE INSERT OVERWRITE和WITH AS语句同时使用

with as子句要放到insert语句的前边,并且with语句和insert之间不能又分号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE ramesh_test
(key BIGINT,
text_value STRING,
roman_value STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

WITH v_text
AS
(SELECT 1 AS key, 'One' AS value),
v_roman
AS
(SELECT 1 AS key, 'I' AS value)
INSERT OVERWRITE TABLE ramesh_test
SELECT v_text.key, v_text.value, v_roman.value
FROM v_text JOIN v_roman
ON (v_text.key = v_roman.key);

参考 https://stackoverflow.com/questions/38246042/hive-insert-overwrite-using-with-clause