Hämta mer data från Power BI

Med fetchMoreData-API :et kan du läsa in datasegment av olika storlekar som ett sätt att göra det möjligt för visuella Power BI-objekt att kringgå den hårda gränsen för en datavy på 30 000 rader. Förutom den ursprungliga metoden för att aggregera alla begärda segment har API:et nu även stöd för inläsning av datasegment stegvis.

Du kan konfigurera antalet rader som ska hämtas åt gången i förväg, eller så kan du använda dataReductionCustomization för att låta rapportförfattaren ange segmentstorleken dynamiskt.

Kommentar

API:et fetchMoreData är tillgängligt i version 3.4 och senare.

Det dynamiska dataReductionCustomization API:et är tillgängligt i version 5.2 och senare.

Om du vill ta reda på vilken version du använder kontrollerar apiVersion du i filen pbiviz.json .

Aktivera en segmenterad hämtning av stora semantiska modeller

Definiera en fönsterstorlek för dataReductionAlgorithm i det visuella objektets capabilities.json-fil för den obligatoriska dataViewMapping. Avgör count fönsterstorleken, vilket begränsar antalet nya datarader som du kan lägga till dataview i i varje uppdatering.

Lägg till exempel till följande kod i filen capabilities.json för att lägga till 100 rader data i taget:

"dataViewMappings": [
    {
        "table": {
            "rows": {
                "for": {
                    "in": "values"
                },
                "dataReductionAlgorithm": {
                    "window": {
                        "count": 100
                    }
                }
            }
    }
]

Nya segment läggs till i det befintliga dataview och tillhandahålls till det visuella objektet som ett update anrop.

Använda fetchMoreData i det visuella Power BI-objektet

I Power BI kan fetchMoreData du på något av två sätt:

  • segment sammansättningsläge
  • inkrementellt uppdateringsläge

Segmentsammansättningsläge (standard)

Med segmentens sammansättningsläge innehåller datavyn som tillhandahålls till det visuella objektet de ackumulerade data från alla tidigare fetchMoreData requests. Därför växer datavyns storlek med varje uppdatering enligt fönsterstorleken. Om till exempel totalt 100 000 rader förväntas och fönsterstorleken är inställd på 10 000 ska den första uppdateringsdatavyn innehålla 10 000 rader, den andra uppdateringsdatavyn ska innehålla 20 000 rader och så vidare.

Välj segmentsammansättningsläget genom att anropa fetchMoreData med aggregateSegments = true.

Du kan avgöra om data finns genom att kontrollera om det finns dataView.metadata.segment:

    public update(options: VisualUpdateOptions) {
        const dataView = options.dataViews[0];
        console.log(dataView.metadata.segment);
        // output: __proto__: Object
    }

Du kan också kontrollera om uppdateringen är den första uppdateringen eller en efterföljande uppdatering genom att kontrollera options.operationKind. I följande kod VisualDataChangeOperationKind.Create refererar till det första segmentet och VisualDataChangeOperationKind.Append refererar till efterföljande segment.

// CV update implementation
public update(options: VisualUpdateOptions) {
    // indicates this is the first segment of new data.
    if (options.operationKind == VisualDataChangeOperationKind.Create) {

    }

    // on second or subsequent segments:
    if (options.operationKind == VisualDataChangeOperationKind.Append) {

    }

    // complete update implementation
}

Du kan också anropa fetchMoreData metoden från en UI-händelsehanterare:

btn_click(){
{
    // check if more data is expected for the current data view
    if (dataView.metadata.segment) {
        // request for more data if available; as a response, Power BI will call update method
        let request_accepted: bool = this.host.fetchMoreData(true);
        // handle rejection
        if (!request_accepted) {
            // for example, when the 100 MB limit has been reached
        }
    }
}

Som svar på att anropa this.host.fetchMoreData metoden anropar update Power BI metoden för det visuella objektet med ett nytt datasegment.

Kommentar

För att undvika begränsningar för klientminne begränsar Power BI den hämtade datasumman till 100 MB. När den här gränsen har nåtts fetchMoreData() returnerar false.

Läge för inkrementella uppdateringar

Med läget för inkrementella uppdateringar innehåller datavyn som tillhandahålls till det visuella objektet endast nästa uppsättning inkrementella data. Datavisningsstorleken är lika med den definierade fönsterstorleken (eller mindre, om den sista databiten är mindre än fönsterstorleken). Om till exempel totalt 101 000 rader förväntas och fönsterstorleken är inställd på 10 000, skulle det visuella objektet få 10 uppdateringar med en datavystorlek på 10 000 och en uppdatering med en datavy av storlek 1 000.

Läget för inkrementella uppdateringar väljs genom att anropa fetchMoreData med aggregateSegments = false.

Du kan avgöra om data finns genom att kontrollera om det finns dataView.metadata.segment:

    public update(options: VisualUpdateOptions) {
        const dataView = options.dataViews[0];
        console.log(dataView.metadata.segment);
        // output: __proto__: Object
    }

Du kan också kontrollera om uppdateringen är den första uppdateringen eller en efterföljande uppdatering genom att kontrollera options.operationKind. I följande kod VisualDataChangeOperationKind.Create refererar till det första segmentet och VisualDataChangeOperationKind.Segment refererar till efterföljande segment.

// CV update implementation
public update(options: VisualUpdateOptions) {
    // indicates this is the first segment of new data.
    if (options.operationKind == VisualDataChangeOperationKind.Create) {

    }

    // on second or subsequent segments:
    if (options.operationKind == VisualDataChangeOperationKind.Segment) {
        
    }

    // skip overlapping rows 
    const rowOffset = (dataView.table['lastMergeIndex'] === undefined) ? 0 : dataView.table['lastMergeIndex'] + 1;

    // Process incoming data
    for (var i = rowOffset; i < dataView.table.rows.length; i++) {
        var val = <number>(dataView.table.rows[i][0]); // Pick first column               
            
     }
     
    // complete update implementation
}

Du kan också anropa fetchMoreData metoden från en UI-händelsehanterare:

btn_click(){
{
    // check if more data is expected for the current data view
    if (dataView.metadata.segment) {
        // request for more data if available; as a response, Power BI will call update method
        let request_accepted: bool = this.host.fetchMoreData(false);
        // handle rejection
        if (!request_accepted) {
            // for example, when the 100 MB limit has been reached
        }
    }
}

Som svar på att anropa this.host.fetchMoreData metoden anropar update Power BI metoden för det visuella objektet med ett nytt datasegment.

Kommentar

Även om data i de olika uppdateringarna av datavyerna mestadels är exklusiva, finns det viss överlappning mellan efterföljande datavyer.

För tabell- och kategoridatamappning kan de första N datavyraderna förväntas innehålla data som kopierats från den tidigare datavyn.

N kan fastställas genom att: (dataView.table['lastMergeIndex'] === undefined) ? 0 : dataView.table['lastMergeIndex'] + 1

Det visuella objektet håller datavyn skickad till den så att den kan komma åt data utan extra kommunikation med Power BI.

Anpassad dataminskning

Eftersom utvecklaren inte alltid i förväg kan veta vilken typ av data det visuella objektet ska visa, kanske de vill tillåta rapportförfattaren att ange datasegmentets storlek dynamiskt. Från API version 5.2 kan du låta rapportförfattaren ange storleken på de datasegment som hämtas varje gång.

Om du vill att rapportförfattaren ska kunna ange antalet måste du först definiera ett egenskapsfönsterobjekt som heter dataReductionCustomization i filen capabilities.json :

    "objects": {
        "dataReductionCustomization": {
            "displayName": "Data Reduction",
            "properties": {
                "rowCount": {
                    "type": {
                        "numeric": true
                    },
                    "displayName": "Row Reduction",
                    "description": "Show Reduction for all row groups",
                    "suppressFormatPainterCopy": true
                },
                "columnCount": {
                    "type": {
                        "numeric": true
                    },
                    "displayName": "Column Reduction",
                    "description": "Show Reduction for all column groups",
                    "suppressFormatPainterCopy": true
                }
            }
        }
    },

dataViewMappingsEfter definierar du sedan standardvärdena för dataReductionCustomization.

   "dataReductionCustomization": {
        "matrix": {
            "rowCount": {
                "propertyIdentifier": {
                    "objectName": "dataReductionCustomization",
                    "propertyName": "rowCount"
                },
                "defaultValue": "100"
            },
            "columnCount": {
                "propertyIdentifier": {
                    "objectName": "dataReductionCustomization",
                    "propertyName": "columnCount"
                },
                "defaultValue": "10"
            }
        }
    }

Informationen om dataminskning visas under visuellt objekt i formatfönstret.

Skärmbild av formatpannan med alternativet att ange antal dataminskningar.

Beaktanden och begränsningar

  • Fönsterstorleken är begränsad till ett intervall på 2–30 000.

  • Det totala antalet rader i datavyn är begränsat till 1 048 576 rader.

  • Minnesstorleken för datavyn är begränsad till 100 MB i segmentsammansättningsläge.