Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将时间戳列与字符串列串联_Scala_Apache Spark - Fatal编程技术网

Scala 将时间戳列与字符串列串联

Scala 将时间戳列与字符串列串联,scala,apache-spark,Scala,Apache Spark,我需要将数据从Cassandra推送到Elasticsearch。已从cassandra加载数据帧,但名为timestamp的列采用Long格式,因此我需要将其更改为timestamp以使其更具“人类可读性”,我使用了: val cassDF2 = spark.createDataFrame(rawCass).withColumn("timestamp", ($"timestamp").cast(TimestampType)) Dataframe现在看起来像: +---------------

我需要将数据从Cassandra推送到Elasticsearch。已从
cassandra
加载数据帧,但名为
timestamp
的列采用
Long
格式,因此我需要将其更改为
timestamp
以使其更具“人类可读性”,我使用了:

val cassDF2 = spark.createDataFrame(rawCass).withColumn("timestamp", ($"timestamp").cast(TimestampType))
Dataframe现在看起来像:

+--------------------+--------------------+-------------+--------------------+--------------------+
|             eventID|           timestamp|       userID|           sessionID|            fullJson|
+--------------------+--------------------+-------------+--------------------+--------------------+
|event00001.withSa...| 2018-11-15 09:00...|2512988381908|  WITH_EVENTS_IMPORT|{"header": {"appI...|
|event00002.withSa...| 2018-11-15 09:00...|2512988381908|WITH_EVENTS_SESSI...|{"body": {}, "hea...|
|event00003.withPa...| 2018-11-15 09:00...|2006052984315|  WITH_EVENTS_IMPORT|{"header": {"appI...|
+--------------------+--------------------+-------------+--------------------+--------------------+
现在,我需要将3列(
seesionID、userID和timestamp
)连接成一个新列(
docID
),并将其推送到ES:

  // concatStrings function
  val concatStrings = udf((userID: String, timestamp: String, eventID: String) => {userID + timestamp + eventID})

  // create column docID
  val cassDF = cassDF2.withColumn("docID", concatStrings($"userID", $"timestamp", $"eventID"))
获取错误:

org.apache.spark.sql.AnalysisException:“时间戳”不是数字 专栏。聚合函数只能应用于数值列

我知道
timestamp
是在调用
之后。cast
现在是一个对象,不能像以前那样聚合(当它是
Long
类型时),但是如何将它的值提取为字符串或可以聚合的东西

我所能做的就是在
timestamp
列为
Long
时完成这项工作


我的最终数据帧应该看起来像
cassDF2
,但是有一个新的列
docID
,其中包含
251929883819082018-12-09T12:25:25.904+0100event00001。使用…
而不是
15147612000002512988381908event00001。使用
docID
中的…
不需要UDF。您可以使用内置方法
concat
将包含字符串格式的
timestamp
列与特定日期格式的列拼凑在一起,如下所示:

import spark.implicits._
import org.apache.spark.sql.functions._
import java.sql.Timestamp

val df = Seq(
  ("1001", Timestamp.valueOf("2018-11-15 09:00:00"), "Event1"),
  ("1002", Timestamp.valueOf("2018-11-16 10:30:00"), "Event2")
).toDF("userID", "timestamp", "eventID")

val dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

df.
  withColumn("docID", concat($"userID", date_format($"timestamp", dateFormat), $"eventID")).
  show(false)
// +------+-------------------+-------+--------------------------------------+
// |userID|timestamp          |eventID|docID                                 |
// +------+-------------------+-------+--------------------------------------+
// |1001  |2018-11-15 09:00:00|Event1 |10012018-11-15T09:00:00.000-0800Event1|
// |1002  |2018-11-16 10:30:00|Event2 |10022018-11-16T10:30:00.000-0800Event2|
// +------+-------------------+-------+--------------------------------------+

不需要自定义项。您可以使用内置方法
concat
将包含字符串格式的
timestamp
列与特定日期格式的列拼凑在一起,如下所示:

import spark.implicits._
import org.apache.spark.sql.functions._
import java.sql.Timestamp

val df = Seq(
  ("1001", Timestamp.valueOf("2018-11-15 09:00:00"), "Event1"),
  ("1002", Timestamp.valueOf("2018-11-16 10:30:00"), "Event2")
).toDF("userID", "timestamp", "eventID")

val dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

df.
  withColumn("docID", concat($"userID", date_format($"timestamp", dateFormat), $"eventID")).
  show(false)
// +------+-------------------+-------+--------------------------------------+
// |userID|timestamp          |eventID|docID                                 |
// +------+-------------------+-------+--------------------------------------+
// |1001  |2018-11-15 09:00:00|Event1 |10012018-11-15T09:00:00.000-0800Event1|
// |1002  |2018-11-16 10:30:00|Event2 |10022018-11-16T10:30:00.000-0800Event2|
// +------+-------------------+-------+--------------------------------------+

是否有任何原因表明导入后Cassandra中的文档数量与ES中的文档数量不相等,即使相同数量的文档正在使用我的脚本进行处理?@Dejan Marić,我建议您使用相关标签(例如Cassandra/Elasticsearch)组合一个单独的问题,而不是发表评论以及能够重现上述问题的最小数据集。是否有任何原因表明,导入后Cassandra中的文档数量与ES中的文档数量不相等,即使相同数量的文档也在使用我的脚本进行处理?@Dejan Marić,而不是作为注释发布,我建议您用相关标签(如Cassandra/Elasticsearch)和能够重现上述问题的最小数据集组合一个单独的问题。