Skip to main content
Woohoo! Qlik Community has won “Best in Class Community” in the 2024 Khoros Kudos awards!
Announcements
Nov. 20th, Qlik Insider - Lakehouses: Driving the Future of Data & AI - PICK A SESSION
cancel
Showing results for 
Search instead for 
Did you mean: 
gadratjulien
Partner - Contributor II
Partner - Contributor II

Découpage d'un XML très volumineux en n QVD de m lignes

bonjour, je cherche à transformer un XML très volumineux (plus de 15 Go, plusieurs millions de lignes) en QVD mais Qlik sur mon PC n'arrive pas aller au bout du fichier (insuffisance de mémoire).

Mon script est un simple import du XML à 13 champs dans une table appelée [REV]:

[REV]:

LOAD

    VersionName,

    PeriodName,

    RespCenterName,

    RevenueTypeName,

    CostObject1Name,

    CostObject2Name,

    CostObject3Name,

    CostObject4Name,

    CostObject5Name,

    CurrencyName,

    UnitPrice,

    UnitsSold,

    Revenue

FROM [..\Data XML\REV.XML] (XmlSimple, Table is [PPAData/Action/RevenueRecord]);

STORE [REV] INTO [..\Data QVD\REV.qvd] (qvd);

Drop table [REV];

Voyant que cela ne passe pas, j'ai limité à 100 000 1ères lignes avec :

LET vFirst = 100000;


FIRST $(vFirst) LOAD ...

Ca passe pour des paquets de 100 000 lignes

J'aimerai donc faire des QVD représentant par exemples des paquets de 100 000 lignes pour hacher mon XML en x QVD.

Avez-vous une idée sur la manière de faire?

Merci d'avance pour vos suggestions,

Julien

5 Replies
Not applicable

tu peux eventuellement charger tout ca dans une table temporaire

T1:

load ... from ...

puis boucler pour stocker par période

select Periode as Boucle resident T1;

let vNoPer=fieldvaluecount(Periode);

for i=1 to vNoPer

     let vPer = fieldvalue('Boucle',i)

     t2 :

     load ... resident T1;

     Store T2 into ...

next;

en esperant que ca puisse t'aider

Anonymous
Not applicable

Salut Julien,

Existe-t-il un champ qui puisse servir d'incrément?

La commande FIRST ne saurait pas être utile dans une itération, puisqu'elle ne prend que les premiers records.

Une piste:

1 - Evalue les combinaisons VersionName, PeriodName

LOAD

    VersionName, PeriodName

FROM tasource;

Si les lignes sont bien distribuées, alors passe à l'étape suivante

2- Effectue un load distinct des valeurs

Map_Temp:

LOAD DISTINCT

     VersionName, PeriodName

FROM tasource;

3-Itère sur ces valeurs

   

EDIT: Betise, j'ai oublié le where clause

FOR Each vVersion in FieldValueList ('VersionName')

     FOR Each vPeriod in FieldValueList ('PeriodName')

     'T_$(vVersion)_$(vPeriod)':

     LOAD *

     FROM tasource

     WHERE VersionName = $(vVersion) and PeriodName = $(vPeriod);

     STORE 'T_$(vVersion)_$(vPeriod)' into [l'endroitdetonchoix\T_$(vVersion)_$(vPeriod).qvd];

     DROP TABLE 'T_$(vVersion)_$(vPeriod)';

   

     NEXT vPeriod

NEXT vVersion

Si les lignes ne sont pas bien distribuées, alors il faudrait créer en amont un index de cononne qui puisse te permettre l'itération.

Bonne chance,

Antoine

gadratjulien
Partner - Contributor II
Partner - Contributor II
Author

merci pour l'idée. je n'ai dans le XML qu'une seule période et une seule version mais je vais donc m'inspirer de ta boucle pour découper selon un autre champ. tout dépend de la distribution des données

gadratjulien
Partner - Contributor II
Partner - Contributor II
Author

aucune indexation dans le XML. je vais en effet partir une une boucle sur un champ autre que version ou période car mon XML est un extract déjà de 1 version et 1 période

Not applicable

si c'est effectivement une seule version et 1 seule période , tu aussi ajouter dans le load le RowNo puis ensuite faire des tranches homogènes de XXXXXXX lignes

bons tests