【发布时间】:2020-01-29 08:37:59
【问题描述】:
我在一个 dataframe 中有数据,它是从 azure eventthub 获得的。 然后我将此数据转换为 json 对象并将所需的数据存储到数据集中,如下所示。
从 eventthub 获取数据并将其存储到数据框中的代码。
val connectionString = ConnectionStringBuilder(<ENDPOINT URL>)
.setEventHubName(<EVENTHUB NAME>).build
val currTime = Instant.now
val ehConf = EventHubsConf(connectionString)
.setConsumerGroup("<CONSUMER GRP>")
.setStartingPosition(EventPosition
.fromEnqueuedTime(currTime.minus(Duration.ofMinutes(30))))
.setEndingPosition(EventPosition.fromEnqueuedTime(currTime))
val reader = spark.read.format("eventhubs").options(ehConf.toMap).load()
var SIGNALS = reader
.select(get_json_object(($"body").cast("string"),"$.NUM").alias("NUM"),
get_json_object(($"body").cast("string"),"$.SIG1").alias("SIG1"),
get_json_object(($"body").cast("string"),"$.SIG2").alias("SIG2"),
get_json_object(($"body").cast("string"),"$.SIG3").alias("SIG3"),
get_json_object(($"body").cast("string"),"$.SIG4").alias("SIG4")
)
val SIGNALSFiltered = SIGNALS.filter(col("SIG1").isNotNull &&
col("SIG2").isNotNull && col("SIG3").isNotNull && col("SIG4").isNotNull)
SIGNALSFiltered处得到的数据如下所示。
+-----------------+--------------------+--------------------+--------------------+--------------------+
| NUM| SIG1| SIG2| SIG3| SIG4|
+-----------------+--------------------+--------------------+--------------------+--------------------+
|XXXXX01|[{"TIME":15695605310...|[{"TIME":15695605310...|[{"TIME":15695605310...|[{"TIME":15695605310...|
|XXXXX02|[{"TIME":15695604780...|[{"TIME":15695604780...|[{"TIME":15695604780...|[{"TIME":15695604780...|
|XXXXX03|[{"TIME":15695605310...|[{"TIME":15695605310...|[{"TIME":15695605310...|[{"TIME":15695605310...|
|XXXXX04|[{"TIME":15695605310...|[{"TIME":15695605310...|[{"TIME":15695605310...|[{"TIME":15695605310...|
|XXXXX05|[{"TIME":15695605310...|[{"TIME":15695605310...|[{"TIME":15695605310...|[{"TIME":15695605310...|
|XXXXX06|[{"TIME":15695605340...|[{"TIME":15695605340...|[{"TIME":15695605340...|[{"TIME":15695605340...|
|XXXXX07|[{"TIME":15695605310...|[{"TIME":15695605310...|[{"TIME":15695605310...|[{"TIME":15695605310...|
|XXXXX08|[{"TIME":15695605310...|[{"TIME":15695605310...|[{"TIME":15695605310...|[{"TIME":15695605310...|
如果我们检查单个行的整个数据,它将如下所示。
|XXXXX01|[{"TIME":1569560531000,"VALUE":3.7825},{"TIME":1569560475000,"VALUE":3.7812},{"TIME":1569560483000,"VALUE":1.7812},{"TIME":1569560491000,"VALUE":7.7875}]|
[{"TIME":1569560537000,"VALUE":3.7825},{"TIME":1569560481000,"VALUE":9.7825},{"TIME":1569560489000,"VALUE":5.7825},{"TIME":1569560497000,"VALUE":34.7825}]|
[{"TIME":1569560505000,"VALUE":34.7825},{"TIME":1569560513000,"VALUE":9.7825},{"TIME":1569560521000,"VALUE":34.7825},{"TIME":1569560527000,"VALUE":4.7825}]|
[{"TIME":1569560535000,"VALUE":7.7825},{"TIME":1569560479000,"VALUE":35.7825},{"TIME":1569560487000,"VALUE":3.7825}]
我想将每个信号列中的每个时间值对转换为新行。
有什么方法可以将基础数据集转换如下?列中的每个元素都应转换为新行。
+-----------------+-----------------------------+---------------------------------------+-----------------------------+
| NUM| SIG1 TIME| SIG1 VALUE| SIG2 TIME| SIG2 VALUE| SIG3 TIME| SIG3 VALUE| SIG4 TIME| SIG4 VALUE |
+-----------------+-----------------------------+---------------------------------------+-----------------------------+
|XXXXX01|1569560531000| 3.7825|1569560531000| 4.7825|1569560531000| 8.7825|1569560531000| 2.7825|
|XXXXX01|1569560531000| 1.7825|1569560531000| 1.7825| null | null |1569560531000| 2.7825|
|XXXXX01|1569560531000| 3.7825|1569560531000| 4.7825|1569560531000| 8.7825|1569560531000| 7.7825|
|XXXXX02|1569560531000| 7.7825|1569560531000| 4.7825|1569560531000| 8.7825|1569560531000| 2.7825|
|XXXXX02|null | null |1569560531000| 5.7825|1569560531000| 7.7825|1569560531000| 5.7825|
|XXXXX02|1569560531000| 3.7825|1569560531000| 4.7825|1569560531000| 8.7825|1569560531000| 2.7825|
|XXXXX02|1569560531000| 5.7825|1569560531000| 7.7825|1569560531000| 9.7825|1569560531000| 2.7825|
感谢任何线索或帮助!提前致谢。
【问题讨论】:
标签: dataframe apache-spark apache-spark-sql apache-spark-dataset