복붙노트

[HADOOP] Phoenix는 음의 정수 값을 올바르게 표시하지 않습니다.

HADOOP

Phoenix는 음의 정수 값을 올바르게 표시하지 않습니다.

정수 -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. ==============================

    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. ==============================

    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));
    
  3. from https://stackoverflow.com/questions/36131091/phoenix-doesnt-display-negative-integer-values-correctly by cc-by-sa and MIT license