簡體   English   中英

在Hive表中更新指定時間范圍內的列值

[英]Update column value for a specified time range in Hive table

Hive表“ Employee”包含列“ timerange”,數據為

timerange
1:10
1:13
1:17
1:21
1:26

如果最后一位數字范圍在(0&4)之間,則數據必須更新為0。如果最后一位數字范圍在(5&9)之間,則必須更新為5。

預期輸出為

timerange
1:10
1:10
1:15
1:20
1:25

我怎樣才能做到這一點?

您可以通過內置的字符串操作來做到這一點:

SELECT CASE WHEN SUBSTRING(timerange, LENGTH(timerange)) < "5"
            THEN CONCAT(SUBSTRING(timerange, 1, LENGTH(timerange) - 1), "0")
            ELSE CONCAT(SUBSTRING(timerange, 1, LENGTH(timerange) - 1), "5")
       END AS timerange
FROM Employee;

您可以創建一個通用UDF( GenericUDF )。

這是示例UDF:

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.IntObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;

public class TimeRangeConverter GenericUDF {

    @Override
    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
        if (arguments.length != 1) {
            throw new UDFArgumentLengthException("The function time_range_converter(time_rage) requires 1 argument.");
        }

        ObjectInspector timeRangeVal = arguments[0];

        if (!(timeRangeVal instanceof StringObjectInspector)) {
            throw new UDFArgumentException("First argument must be of type String (time_range as String)");
        }
        return PrimitiveObjectInspectorFactory.writableStringObjectInspector;
    }

    @Override
    public Object evaluate(DeferredObject[] arguments) throws HiveException {
        String timeRangeVal = (String) ObjectInspectorUtils.copyToStandardJavaObject(arguments[0].get(),
                PrimitiveObjectInspectorFactory.javaStringObjectInspector);

        char[] characters = timeRangeVal.toCharArray();

        if (characters[characters.length - 1] > '5') {
            characters[characters.length - 1] = '5';
        } else {
            characters[characters.length - 1] = '0';
        }

        return String.valueOf(characters);
    }

    @Override
    public String getDisplayString(String[] arguments) {
        assert (arguments.length == 1);
        return "time_range_converter(" + arguments[0] + ")";
    }
}

像下面這樣調用Hive更新語句:

CREATE TEMPORARY FUNCTION time_range_converterAS 'TimeRangeConverter';

UPDATE 
    Employee 
SET 
    timerange = time_range_converter(timerange);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM