L'agrégation par Groupe Par date dans Spark SQL
J'ai un RDD contenant un timestamp nommé temps de type long:
root
|-- id: string (nullable = true)
|-- value1: string (nullable = true)
|-- value2: string (nullable = true)
|-- time: long (nullable = true)
|-- type: string (nullable = true)
Je suis en train de groupe par valeur1, valeur2 et le temps que le AAAA-MM-JJ. J'ai essayé de groupe en plâtre(le temps que la Date) mais j'ai eu l'erreur suivante:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.spark.deploy.worker.DriverWrapper$.main(DriverWrapper.scala:40)
at org.apache.spark.deploy.worker.DriverWrapper.main(DriverWrapper.scala)
Caused by: java.lang.RuntimeException: [1.21] failure: ``DECIMAL'' expected but identifier Date found
Est-ce à dire il n'y a pas moyen de regrouper en un jour? J'ai même essayé d'ajouter un autre niveau de casting pour l'avoir comme une Chaîne de caractères:
cast(cast(time as Date) as String)
Qui renvoie la même erreur.
J'ai lu que je pouvais utiliser probablement aggregateByKey sur le CA, mais je ne comprends pas comment l'utiliser pour un peu de colonnes, et de convertir de temps pour une AAAA-MM-JJ Chaîne. Comment dois-je procéder?
OriginalL'auteur galex | 2015-05-05
Vous devez vous connecter pour publier un commentaire.
J'ai résolu le problème en ajoutant ces fonctions:
Et en l'inscrivant dans le sqlContext comme ceci:
Puis j'ai enfin pu grouper par date:
OriginalL'auteur galex
Je suis en utilisant Étincelle 1.4.0 et depuis 1.2.0
DATE
semble être présent dans l'Étincelle API SQL (SPARK-2562).DATE
devrait vous permettre de groupe par le temps queYYYY-MM-DD
.J'ai aussi une structure de données similaires, où mon
created_on
est analogue à votretime
champ.Je l'ai résolu en utilisant
FROM_UNIXTIME(created_on,'YYYY-MM-dd')
et qui fonctionne bien:À partir de là, vous pouvez effectuer les opérations normales, l'exécution de la requête dans un dataframe et ainsi de suite.
FROM_UNIXTIME
travaillé probablement parce que j'ai de la Ruche inclus dans mon Étincelle d'installation et c'est un La ruche UDF. Toutefois, il sera inclus dans le cadre de la Spark SQL native de la syntaxe dans les futures versions (SPARK-8175).OriginalL'auteur J Rivera
Ne sais pas si c'est ce que tu voulais dire/de besoin, mais j'ai ressenti le même combat-ness traiter avec la date et l'horodatage dans spark-sql et la seule chose que je suis venu avec était coulée de la chaîne d'horodatage, puisqu'il semble impossible (pour moi) d'avoir la Date de type spark-sql.
De toute façon, c'est mon code pour accomplir quelque chose de similaire (Long à la place de String) pour votre besoin (peut-être):
et le résultat est quelque chose comme ceci:
- Ce que cela pourrait être utile pour vous, même si je suis à l'aide d'horodatage et non pas la Date?
Espère qu'elle pourra aider
FF
EDIT:
afin de tester un "casting" de Long à l'Horodatage j'ai essayé ce simple changement:
et tout a bien fonctionné avec le résultat:
J'ai essayé de "simple" coulé long d'horodatage à l'intérieur de l'étincelle-sql et je n'ai pas remarqué de problème
Dans le groupe?
J'ai juste édité ma réponse avec un simple exemple supplémentaire à l'aide d'un type Long à l'intérieur de ma requête
si vous êtes toujours aux prises avec ce problème, pourriez-vous svp poster votre code afin de comprendre ce qui vous donne cette erreur?
OriginalL'auteur Fabio Fantoni