[HADOOP] Phoenix는 음의 정수 값을 올바르게 표시하지 않습니다.
HADOOPPhoenix는 음의 정수 값을 올바르게 표시하지 않습니다.
정수 -17678의 값을 갖는 HBASE 테이블을 생성합니다. 하지만 pheonix에서 검색하면 다른 긍정적 인 가치가 있습니다. RowKey는 복합 행 키이며 행 키에는 문제가 없습니다.
Hbase 삽입 :
public class test
{
public static void main(String args[])
{
Configuration config = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(config);
Table table = connection.getTable(TableName.valueOf("TEST"));
Integer i=-17678;
try
{
Put p = new Put(Bytes.toBytes("rowkey"));
p.addColumn(Bytes.toBytes("test"),Bytes.toBytes("test"),Bytes.toBytes(i));
table.put(p);
}
finally
{
table.close();
connection.close();
}
}
}
피닉스 검색 :
TEST에서 CAST ( "Value"AS INTEGER)를 선택하십시오.
+------------------------------------------+
| TO_INTEGER(test."Value") |
+------------------------------------------+
| 2147465970 |
+------------------------------------------+
여기 뭐가 잘못 됐니? 또는 피닉스 문제?
해결법
-
==============================
1.http://phoenix.apache.org/language/datatypes.html
http://phoenix.apache.org/language/datatypes.html
HBase 직렬화 포맷을 Phoenix 포맷으로 변환하려면 :
(-17678)10 = (11111111111111111011101011110010)2 => (01111111111111111011101011110010)2 = (2147465970)10
따라서 예상대로 출력됩니다. HBase를 사용하여 데이터를 삽입 할 때 이진 표현을 알아야합니다.
직접 HBase to Phoenix 읽기는 CHAR 및 UNSIGNED_ * 데이터 유형에서만 가능합니다. 다른 데이터 형식을 위해 적절하게 직렬화해야합니다. 즉. -17678을 삽입 할 때 i = 2147465970을 설정하십시오.
Phoenix를 사용하여 데이터를 삽입하는 것이 좋습니다. 응용 프로그램의 종속성에 대해 걱정할 필요가 없다면 Phoenix는 "thin"jdbc 드라이버 (86MB 대신 4MB)를 제공합니다.
https://phoenix.apache.org/server.html
HBase를 꼭 사용해야하는 경우 비트 XOR을 사용하여 부호있는 숫자를 직렬화 할 수 있습니다.
정수의 경우 부호 비트를 플립하기 위해 비트 마스크를 사용하여 i를 XOR 할 수 있습니다.
4 바이트 정수에 적용 할 비트 마스크는 다음과 같습니다.
(10000000000000000000000000000000)2 = (-2147483648)10
http://ideone.com/anhgs5에서 2147465970을 얻습니다. HBase를 사용하여 삽입하면 Phoenix를 읽을 때 -17678을 읽게됩니다.
Bigint (날짜 - 시간 유형과 공유 비트 마스크), Smallint, Float 및 Double에 대해 다른 비트 마스크가 필요합니다.
-
==============================
2.다음과 같이 시도해보십시오.
다음과 같이 시도해보십시오.
//Add dependencies in your pom.xml <dependency> <groupId>org.apache.phoenix</groupId> <artifactId>phoenix-core</artifactId> <version>${phoenix.core.version}</version> <scope>provided</scope> </dependency>
그리고보다:
//Import these classes. More types available import org.apache.phoenix.schema.types.{PDecimal, PInteger, PVarchar} //and replace your addColumn method by this one: p.addColumn(Bytes.toBytes("test"),Bytes.toBytes("test"),PInteger.INSTANCE.toBytes(i)); //Or if you wish a Decimal p.addColumn(Bytes.toBytes("test"),Bytes.toBytes("test"),PDecimal.INSTANCE.toBytes(i));
from https://stackoverflow.com/questions/36131091/phoenix-doesnt-display-negative-integer-values-correctly by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 감속기에서 매퍼 카운터 값에 액세스하는 방법? (0) | 2019.07.22 |
---|---|
[HADOOP] jobtracker.info 파일은 1 대신에 0 노드로만 복제 될 수있었습니다. (0) | 2019.07.22 |
[HADOOP] Hadoop 백업 및 복구 도구 및 지침 (0) | 2019.07.22 |
[HADOOP] 하이브의 비뚤어진 테이블 (0) | 2019.07.22 |
[HADOOP] 하둡지도 축소 Google 웹 그래프 (0) | 2019.07.22 |