【问题标题】:Regex extraction in SQLSQL 中的正则表达式提取
【发布时间】:2020-06-05 21:14:26
【问题描述】:

我有以下数据格式,我试图从中提取 id 部分, {"memberurn"=urn:li:member:10000012} 这是我的代码,

CAST(regexp_extract(key.memberurn, 'urn:li:member:(\\d+)', 1) AS BIGINT) AS member_id

在输出 member_id 为 NULL 我在这里做错了什么?

【问题讨论】:

  • 您使用的是什么关系型数据库? Oracle、SQL-Server、MySQL 等?
  • @Barmar 我使用的是 spark sql,数据存储在 Hive 中。

标签: sql regex apache-spark-sql


【解决方案1】:

试试这个:

 from pyspark.sql import SparkSession
 import pyspark.sql.functions as F
 from pyspark.sql.types import LongType

 spark = SparkSession.builder \
.appName('practice')\
.getOrCreate()

 sc= spark.sparkContext

 df= sc.parallelize([
 [""" {"memberurn"=urn:li:member:10000012}"""]]).toDF(["a"])

 df.show(truncate=False)

+-------------------------------------+
|a                                    |
+-------------------------------------+
| {"memberurn"=urn:li:member:10000012}|
+-------------------------------------+


df1= df.withColumn("id", F.regexp_extract(F.col('a'), 
'(urn:li:member:)(\d+)', 2))


df2= df1.withColumn("id",df1["id"].cast(LongType()))


df2.show()

+-------------------------------------+--------+
|a                                    |id      |
+-------------------------------------+--------+
| {"memberurn"=urn:li:member:10000012}|10000012|
+-------------------------------------+--------+

print(df2.printSchema())


root
  |-- a: string (nullable = true)
  |-- id: long (nullable = true)

【讨论】:

  • 我用的不是pySpark,而是spark scala,不过让我试试吧。
  • 我更新了将 id 列强制转换为 LongType Numerical 的代码
【解决方案2】:

在scala中-

使用 regex_extract

val df = spark.range(1).withColumn("memberurn", lit("urn:li:member:10000012"))
    df.withColumn("member_id",
      expr("""CAST(regexp_extract(memberurn, 'urn:li:member:(\\d+)', 1) AS BIGINT)"""))
      .show(false)

    /**
      * +---+----------------------+---------+
      * |id |memberurn             |member_id|
      * +---+----------------------+---------+
      * |0  |urn:li:member:10000012|10000012 |
      * +---+----------------------+---------+
      */

使用 substring_index


    df.withColumn("member_id",
      substring_index($"memberurn", ":", -1).cast("bigint"))
      .show(false)

    /**
      * +---+----------------------+---------+
      * |id |memberurn             |member_id|
      * +---+----------------------+---------+
      * |0  |urn:li:member:10000012|10000012 |
      * +---+----------------------+---------+
      */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    相关资源
    最近更新 更多