首页 > 解决方案 > 如何在 spark hive 中应用带有 unicode 字符的 regexp_replace

问题描述

我正在尝试计算 spark 数据框中字符串中表情符号的出现次数。我使用 SQLTransformer。我的声明:

select LENGTH(regexp_replace(text, '[^\\uD83C-\\uDBFF\\uDC00-\\uDFFF]+', '')) as count_emoji from __THIS__

但是这个说法是行不通的。

我究竟做错了什么?

标签: regexapache-sparkhive

解决方案


看起来您的 SQLTransform 正在工作。请找到如下代码。

object SparkHiveExample extends App {

  val spark = SparkSession
    .builder()
    .master("local")
    .appName("Spark Hive Example")
    .getOrCreate()

  import spark.implicits._

  //Prepare Test Data
  val df = Seq("hello, how are you?\uD83D\uDE0A\uD83D\uDE0A\uD83D\uDE0A")
    .toDF("text")

  df.show(false)

+-------------------------+
|text                     |
+-------------------------+
|hello, how are you?|
+-------------------------+

  df.createOrReplaceTempView("__THIS__")

  val finalDf = spark.sql("select LENGTH(regexp_replace(text,'[^\\\\uD83C-\\\\uDBFF\\\\uDC00-\\\\uDFFF]+', '')) as count_emoji from __THIS__")

  finalDf.show(false)

+-----------+
|count_emoji|
+-----------+
|3          |
+-----------+

}

如果您想从 Hive 表中读取数据,则使用 HiveSupport 实例化SparkSession,并通过放置 hive-site.xml、core-site.xml(用于安全配置)和 hdfs-site.xml(用于 HDFS 配置)来完成 Hive 的配置文件在 conf/.

// warehouseLocation points to the default location for managed databases and tables
val warehouseLocation = new File("spark-warehouse").getAbsolutePath

val spark = SparkSession
  .builder()
  .appName("Spark Hive Example")
  .config("spark.sql.warehouse.dir", warehouseLocation)
  .enableHiveSupport()
  .getOrCreate()

推荐阅读