- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在我们的用例中,我们将获取格式如下的 UTF-8 文本数据:
Data1§Data2
Data3§Data4
现在我们希望在 Apache Hive 中将 Data1 和 Data3 放在一列中,将 Data2 和 Data4 放在一列中。听起来很简单。
但是,我们无法将 § 字符(即 unicode U+00A7“Section Sign”参见 here)指定为字段分隔符。
我们已经尝试了以下方法,都没有达到可接受的结果。
1) 使用方法终止的普通字段
ROW FORMAT DELIMITED FIELDS TERMINATED BY '§'
返回(注意附加到每个单元格的 ?,在其他客户端中,unicode 符号表示无法识别的符号)
+--------------------+--------------------+--+
| test.column1 | test.column2 |
+--------------------+--------------------+--+
| Data1? | Data2? |
| Data3? | Data4? |
+--------------------+--------------------+-
或八进制表示
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\247'
或
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\304\247'
返回:
+--------------------+--------------------+--+
| test.column1 | test.column2 |
+--------------------+--------------------+--+
| Data1?Data2 | NULL |
| Data3?Data4 | NULL |
+--------------------+--------------------+--+
2) 使用RegexSerDe
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "^([^\\]]+)\\\247([^\\]]+)$")
(在某些测试源数据中将字段分隔符更改为/并使用\057(八进制代表/)会产生正确的结果,但更改源数据对我们来说不可行。)
或
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "^([^\\]]+)\\$([^\\]]+)$")
(在 describe 格式化表语句中,这会产生:
input.regex ^([^\\]]+)\\\uFFFD\uFFFD([^\\]]+)$
其中\uFFFD 是未识别符号的 unicode 表示)
SELECT 的结果总是相同的:
+--------------------+--------------------+--+
| test.column1 | test.column2 |
+--------------------+--------------------+--+
| NULL | NULL |
| NULL | NULL |
+--------------------+--------------------+--+
到目前为止,我的研究表明:
1) Hive 无法使用八进制数高于 177 的不可打印的 ASCII 字符。指向此的指针在其他一些代码中令我感到惊讶 here在 github 上说:
Hive can specify delimiter characters in the form '\ooo' where ooo is a three-digit octal number between 000 and 177.
2) 我还发现只有一字节字符可以用作字段分隔符的证据 here在 BigSQL 的文档中(但不在官方文档中)它说:
Delimiters must be single-byte characters
根据我的研究,§ (unicode U+00A7) 是一个 2 字节的字符 (11000010:10100111)
这是否意味着我不能使用这个定界符,或者有其他方法可以使用它吗?
小更新,如果这个问题仍未解决并且有人需要它:
我尝试了以下方法,将数据暂存为单列表,然后将 § 转换为 ,(逗号),然后用逗号将其拆分。这适用于小样本数据,但对于我的包含 200 多列错误的较大生产表则失败。
select
split(a.textcolumn, '\\,')[0] as column1
,split(a.textcolumn, '\\,')[1] as column2
from
(select translate(textcolumn, '§', ',') as textcolumn from database.stage) a;
这里是错误:
SQL 错误:java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException:评估翻译时出错(stagingstring,'§',';') java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException:评估翻译时出错(stagingstring,'§',';') java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException:评估翻译时出错(stagingstring,'§',';') org.apache.hadoop.hive.ql.metadata.HiveException:评估翻译时出错(stagingstring,'§',';') org.apache.hadoop.hive.ql.metadata.HiveException:评估翻译时出错(stagingstring,'§',';') java.lang.IllegalArgumentException: null
更新 2:
上述方法可行,但如果源数据不干净(有其他 UTF-8 问题),则会抛出上述错误。
最佳答案
您需要使用
创建表格由“-89”终止的字段
'section sign' 的十进制代码是 167。
167 - 256 = -89
这个 -89 应该是你的分隔符。 Hive 允许使用 -127 到 127 范围内的分隔符。
如需进一步阅读以下来自 Cloudera 的代码片段。
https://www.cloudera.com/documentation/enterprise/5-8-x/topics/impala_create_table.html
注意:CREATE TABLE 子句 FIELDS TERMINATED BY、ESCAPED BY 和 LINES TERMINATED BY 对用于其参数的字符串文字有特殊规则,因为它们都需要一个字符。您可以使用由单引号或双引号括起来的常规字符、八进制序列,例如 '\054'(表示逗号),或范围在 '-127'..'128' 内的整数(带引号但不带引号)反斜杠),它被解释为单字节 ASCII 字符。 256减去负值;例如,FIELDS TERMINATED BY '-2' 将字段分隔符设置为 ASCII 代码 254,“Icelandic Thorn”字符用作某些数据格式的分隔符。
关于hadoop - Apache hive : How to use Unicode character (with octal above 177) as field delim,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40461000/
好的,这是我以前从未见过的东西。以下代码片段是在野外发现的(尽管我是在解释,因为我无法访问原始代码): char str[] = u8R"delim(SomeTextInHere)delim"; 谁能
我正在使用 for/f 从 txt 文件中设置批处理文件中的变量: for /f "tokens=1,2 delims==" %%V IN (conf.txt) DO set %%V=%%W 不幸的是
我对批处理脚本非常陌生,但在上一个问题中,我试图从一行文本中提取链接,具体来说: 83: href="https://beepbeep.maxresdefault.
这个问题在这里已经有了答案: Does strtok work with strings (as the delimiter)? [closed] (2 个答案) 关闭 7 年前。 我需要一些关于函
谁能帮我理解命令文件的语法 IF "%INPUT_PATH%"=="" ( echo Searching for latest test results in: %TEST_RESULTS%
如果我有这样的字符串 "This is a string that will be split by this and that" 我想得到分割结果为 "是一个将被拆分的字符串" “还有那个” “这是
我对 preg_split 有疑问。我需要一个正则表达式来将我的字符串拆分为数字和字符。我的字符串的一个例子是: 1_AB_CD_2_ABC_3_ABD 我想要一个结果拆分: 1 AB_CD 2 AB
我正在编写一个脚本,该脚本采用带有“~”分隔符的参数,并且在拆分字符串后我想将值插入到数组中。我有很多关于这个问题的帖子,我几乎就在那里,但有一个失败的案例。这是详细信息。 我的脚本.sh #!/bi
我试图在 delim "//"上断开字符串。我的字符串还包含“/”和 StringTokenizer 给出奇怪的结果,它也会在“/”上中断字符串。 String mStr = "abcd//aa
我有一个如下所示的数据框: A B C D 1 2 3 4 E F G H 5
我正在尝试解析一个文本文件,它除了跳过空列之外还可以工作。文件格式如下: 206695844 66583369 L CAT 1 1 4144042 214857 643
我尝试使用以下 R 命令将不同的制表符 delim 文件合并到单个文件中。 如果您观察到,我什至使用 write.table 命令保存文件。现在我需要阅读相同的文件以进行进一步分析。我面临的最大问题是
前提 我意识到这个question已经存在,但解决方案实际上并没有改变分隔符。我想知道是否可以更改分隔符,或者是否有人知道它所在的位置。 例子 假设我需要将这个字符串传递给一个程序,用逗号分隔,因为这
例如我有这段文字: I know,, more.- today, than yesterday! 我正在用这段代码提取单词: while(getline(&line, &len, fpSourceFi
我有一个脚本可以读取文件并在找到它时设置变量。 @echo off Setlocal EnableDelayedExpansion for /f "tokens=*" %%V in ('findstr
是否可以定义一个不限于 1 个字符的分隔符?基于标题的示例,我想将我的分隔符定义为例如'#+#'。文本文件/行可以包含这两个字符,但您遇到特定子字符串/文本组合的可能性很小。 最佳答案 不可以,您不能
我写了一个简单的 go 程序,但它没有正常工作: package main import ( "bufio" "fmt" "os" ) func main() { re
我有几个 txt 文件,每个文件中有 3 列,如下所示: 文件1: ProbeID X_Signal_intensity X_P-Value xxx 2.34 .
我试图将此字符串拆分为逗号作为分隔符。我输入了一个字符串“Smith,Erdos,William”,它只输出“William”而不是 Smith 和 Erdos。这里一定有什么我看不到的问题,有人可以
有没有办法在 strtok 中多次使用 delim?我只能让代码为 load 或 init 工作,但不能同时为两者工作。示例代码,其中 strtok 用于以 load # 或 init #,#,dir
我是一名优秀的程序员,十分优秀!