j'ai essayé de mettre en œuvre pivotant similaire au serveur sql étincelleScala Spark - agrégation et Pivotant Sur la base de temps Période
A partir de maintenant, j'utilise SqlContext et l'application de toute la transformation dans le sql. Je voudrais savoir si je peux tirer directement du serveur sql et implémenter la fonction de pivot en utilisant spark.
Voici un exemple de ce que je suis en train de requêtes SQL Achievement Server dessous-
create table #temp(ID Int, MonthPrior int, Amount float);
insert into #temp values (100,1,10),(100,2,20),(100,3,30),(100,4,10),(100,5,20),(100,6,60),(200,1,10),(200,2,20),(200,3,30),(300,4,10),(300,5,20),(300,6,60);
select * from #temp;
| ID | MoisPrix | Montant |
| ------- | ---------- | ------ |
| 100 | 1 | 10 |
| 100 | 2 | 20 |
| 100 | 3 | 30 |
| 100 | 4 | 10 |
| 100 | 5 | 20 |
| 100 | 6 | 60 |
| 200 | 1 | 10 |
| 200 | 2 | 20 |
| 200 | 3 | 30 |
| 300 | 4 | 10 |
| 300 | 5 | 20 |
| 300 | 6 | 60 |
Select ID,coalesce([1],0) as Amount1Mth, coalesce([1],0)+coalesce([2],0)+coalesce([3],0) as Amount1to3Mth, coalesce([1],0)+coalesce([2],0)+coalesce([3],0)+coalesce([4],0)+coalesce([5],0)+coalesce([6],0) as Amount_AllMonths from (select * from #temp) A pivot (sum(Amount) for MonthPrior in ([1],[2],[3],[4],[5],[6])) as Pvt
| ID | Amount1Mth | Amount1to3Mth | Amount_AllMonths |
| ------- | ------- | ------- | --- |
| 100 | 10 | 60 | 150 |
| 200 | 10 | 60 | 60 |
| 300 | 0 | 0 | 90 |
Merci, @LeoC Je vais analyser cette approche. Semble fonctionner –
Heureux que cela aide.Veuillez fermer la question en acceptant la réponse si elle résout le problème affiché. –
(un: Seq [Int], b: Seq [Int]) => (un zip b) .toMap pose des problèmes. Je travaille sur ce 'ne peut pas résoudre 'UDF (col_1, col_2)' en raison de la non-concordance de type de données: l'argument 2 requiert le type de tableau, cependant, 'col_2' est de type array . ' Essayé en utilisant nombre/décimal dans udf. N'a toujours pas fonctionné –