繁体   English   中英

在 spark 中将字符串转换为数据帧的四个不同列

[英]Convert a string into four different columns of a dataframe in spark

大家,我是 Spark 的新手(老实说是编程),我需要一些帮助来解决以下情况。 我的输入文件包含以下格式的数据。 端口号-用户ID“GET\\..” 端口号-用户ID“GET\\..”

对于每个用户,我们将有两行数据。 每一行只包含一个字符串(包括空格)但没有适当的分隔符

示例输入:

192.167.56.1-45195 “ GET \docsodb.sp.ip \..”
192.167.56.1-45195 “ GET \https://<url> \..”
238.142.23.5-24788 “ GET \docsodb.sp.ip \..”
238.142.23.5-24788 “ GET \ https://<url>  \..”
30.169.77.213-16745 “ GET \docsodb.sp.ip \..”
30.169.77.213-16745 “ GET \ https://<url> \..”

对于上述数据,我需要以下格式的输出,可能是数据帧。

Portnumber      UserID  URL             division_string
192.167.56.1    45195   https://<url>   docsodb.sp.ip
238.142.23.5    24788   https://<url>   docsodb.sp.ip
30.169.77.213   16745   https://<url>   docsodb.sp.ip

我们可以通过 RDD 转换来实现这一点,还是必须使用 Spark SQL(通过 SQL 查询)。 另外,如果这可以通过任何一种方式实现,您能否解释一下哪种方法更好?

让我们准备数据并运行 spark-shell

cat <<-EOF >in
192.167.56.1-45195 “ GET \docsodb.sp.ip \..”
192.167.56.1-45195 “ GET \https://<url> \..”
238.142.23.5-24788 “ GET \docsodb.sp.ip \..”
238.142.23.5-24788 “ GET \ https://<url>  \..”
30.169.77.213-16745 “ GET \docsodb.sp.ip \..”
30.169.77.213-16745 “ GET \ https://<url> \..”
EOF

spark-shell

现在在 spark-shell 中,我们将文本文件中的数据加载到 DataFrame 中,然后根据 regexp 捕获组对其进行解析,最后按 Portnumber 和 UserId 分组以在一行中获取 Division_string 和 URL,全部使用 DataFrame API。

import spark.implicits._

// Load data
val df = spark.read.format("text").load("in")

// Regexp to parse input line
val re = """([\d\.]+)-(\d+) “ GET \\ ?([^\s]+)"""

// Transform
df.select(regexp_extract('value, re, 1).as("Portnumber"),
          regexp_extract('value, re, 2).as("UserId"),
          regexp_extract('value, re, 3).as("URL_or_div"))
  .groupBy('Portnumber, 'UserId)
  .agg(max(when('URL_or_div.like("https%"), 'URL_or_div)).as("URL"),
       max(when('URL_or_div.like("docsodb%"), 'URL_or_div)).as("division_stringL"))
  .show

+-------------+------+-------------+---------------+
|   Portnumber|UserId|          URL|division_string|
+-------------+------+-------------+---------------+
|30.169.77.213| 16745|https://<url>|  docsodb.sp.ip|
| 192.167.56.1| 45195|https://<url>|  docsodb.sp.ip|
| 238.142.23.5| 24788|https://<url>|  docsodb.sp.ip|
+-------------+------+-------------+---------------+

回答您的最后一个问题 DataFrame API 或 Spark SQL 优于 RDD 操作,除非您需要对处理进行低级控制。 请参阅此处了解更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM