Hat jemand einen Millisekunden-Zeitstempel mit from_json
in Spark 2+ analysiert? Wie ist es gemacht?Parsen von Epochen Millisekunden von JSON mit Spark 2
So Spark changed die TimestampType
zu parse epoch numerische Werte als in Sekunden statt Millis in v2.
Meine Eingabe ist ein Bienenstock Tabelle, die eine json formatierten String in einer Spalte hat, die ich so zu analysieren, ich versuche:
val spark = SparkSession
.builder
.appName("Problematic Timestamps")
.enableHiveSupport()
.getOrCreate()
import spark.implicits._
val schema = StructType(
StructField("categoryId", LongType) ::
StructField("cleared", BooleanType) ::
StructField("dataVersion", LongType) ::
StructField("details", DataTypes.createArrayType(StringType)) ::
…
StructField("timestamp", TimestampType) ::
StructField("version", StringType) :: Nil
)
val item_parsed =
spark.sql("select * FROM source.jsonStrInOrc")
.select('itemid, 'locale,
from_json('internalitem, schema)
as 'internalitem,
'version, 'createdat, 'modifiedat)
val item_flattened = item_parsed
.select('itemid, 'locale,
$"internalitem.*",
'version as'outer_version, 'createdat, 'modifiedat)
Diese eine Zeile mit einer Spalte analysieren kann enthalten:
{ "Zeitstempel": 1494790299549, "gelöscht": false, "Version": "V1", "dataVersion": 2 "categoryId": 2641, "Details": [], ...}
Und das gibt mir timestamp
Felder wie 49338-01-08 00:39:09.0
von einem Wert 1494790299549
die ich eher als gelesen hatte: 2017-05-14 19:31:39.549
Jetzt habe ich das Schema für Zeitstempel gesetzt könnte eine lang sein, dann wird der Wert dividieren von 1000 und Umwandlung in einen Zeitstempel, aber dann bin ich d haben 2017-05-14 19:31:39.000
nicht 2017-05-14 19:31:39.549
. Ich habe Probleme, herauszufinden, wie ich konnte, entweder:
from_json
An einen Millisekunden Zeitstempel zu analysieren (vielleicht durch die TimestampType in irgendeiner Weise Subklassen im Schema zu verwenden)- Verwenden Sie ein
LongType
in der Schema und Cast das zu einem Timestamp, der die Millisekunden bewahrt.
Oh, also wird die Division nicht in eine andere Länge gerundet? Groß! – dlamblin