我正在尝试使用\ COPY命令将TSV数据从文件加载到Postgres表中。
这是一个示例数据行:
2017-11-22 23:00:00 "{\"id\":123,\"class\":101,\"level\":3}"
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的psql命令:
\COPY bogus.test_table (timestamp, sample_json) FROM '/local/file.txt' DELIMITER E'\t'
Run Code Online (Sandbox Code Playgroud)
这是我收到的错误:
ERROR: invalid input syntax for type json
DETAIL: Token "sample_json" is invalid.
CONTEXT: JSON data, line 1: "{"sample_json...
COPY test_table, line 1, column sample_json: ""{\"id\":123,\"class\":101,\"level\":3}""
Run Code Online (Sandbox Code Playgroud)
我验证了JSON的格式正确,并阅读了几个类似的问题,但是我仍然不确定这里发生了什么。一个解释会很棒
我在Jupyter(Scala)笔记本中使用regexp_extract Spark 2.2 SQL函数来匹配包含11个或更多重复字符的字符串。
这是正则表达式:
^(.)\1{10,}$
Run Code Online (Sandbox Code Playgroud)
现在,让我们用regexp_extract函数查看该模式。这是我在笔记本中使用它的方式:
spark.sql("SELECT REGEXP_EXTRACT('hhhhhhhhhhhhh', '^(.)\\1{10,}$', 1) as ExtractedChar").show()
+-------------+
|ExtractedChar|
+-------------+
| |
+-------------+
Run Code Online (Sandbox Code Playgroud)
奇怪,没有输出。让我们确保我的regex模式是正确的。是的,看起来不错。
您可能想知道为什么正则表达式模式包含两个“ \\”字符,这是因为它是一个转义字符,所以两个是必需的。这是一些验证:
1. val string = "SELECT REGEXP_EXTRACT('hhhhhhhhhhhhhhhhhhhhh', '^(.)\\1{10,}$', 1) as ExtractedChar"
2. println(string)
SELECT REGEXP_EXTRACT('hhhhhhhhhhhhhhhhhhhhh', '^(.)\1{10,}$', 1) as ExtractedChar
Run Code Online (Sandbox Code Playgroud)
好吧,让我们确保regexp_extract函数正常工作:
spark.sqlContext.sql("SELECT REGEXP_EXTRACT('TESTING', '^.', 0) as test").show()
+----+
|test|
+----+
| T|
+----+
Run Code Online (Sandbox Code Playgroud)
好吧,也许问题是Jupyter笔记本?检查并使用Scala REPL之后,我仍然遇到相同的问题。
有什么想法为什么我无法使此正则表达式成功匹配吗?
编辑:Spark SQL是对此的要求。我可以使用Scala创建自己的UDF;但是,UDF用Spark装黑盒,这意味着它们不会得到完全优化。