Abrufen größerer Datenmengen von Power BI

Mit der fetchMoreData-API können Sie Datenblöcke verschiedener Größen laden, damit Power BI-Visuals die harte Grenze von 30.000 Zeilendatenansichten umgehen können. Zusätzlich zum ursprünglichen Ansatz, bei dem alle angeforderten Blöcke aggregiert werden, unterstützt die API jetzt auch das inkrementelle Laden der Datenblöcke.

Sie können die Anzahl der Zeilen konfigurieren, die gleichzeitig im Voraus abgerufen werden sollen, oder Sie können dataReductionCustomization verwenden, um dem Berichtsautor das dynamische Festlegen der Blockgröße zu ermöglichen.

Hinweis

Die fetchMoreData-API ist in Version 3.4 und höher verfügbar.

Die dynamische dataReductionCustomization-API ist in Version 5.2 und höher verfügbar.

Um herauszufinden, welche Version Sie verwenden, überprüfen Sie die apiVersion in der Datei pbiviz.json.

Aktivieren eines segmentierten Abrufs großer Semantikmodelle

Definieren Sie eine Fenstergröße für dataReductionAlgorithm in der capabilities.json-Datei des Visuals für die erforderliche dataViewMapping. Die Fenstergröße wird durch count bestimmt. Dadurch wird die Anzahl neuer Datenzeilen begrenzt, die Sie bei jeder Aktualisierung an dataview anfügen können.

Fügen Sie beispielsweise den folgenden Code in der Datei capabilities.json hinzu, um gleichzeitig 100 Datenzeilen anzufügen:

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

Neue Segmente werden an die vorhandene dataview angefügt und dem Visual als update-Aufruf zur Verfügung gestellt.

Verwenden von fetchMoreData im Power BI-Visual

In Power BI gibt es zwei Möglichkeiten für fetchMoreData:

  • Segmentaggregation-Modus
  • Inkrementeller Update-Modus

Modus für die Segmentaggregation (Standard)

Im Segmentaggregationsmodus enthält die Datenansicht, die für das Visual bereitgestellt wird, die akkumulierten Daten aus allen vorherigen fetchMoreData requests. Daher wächst die Größe der Datenansicht mit jeder Aktualisierung entsprechend der Fenstergröße. Wenn z. B. insgesamt 100.000 Zeilen erwartet werden und die Fenstergröße auf 10.000 Zeilen festgelegt ist, sollte die erste Update-Datenansicht 10.000 Zeilen enthalten, die zweite 20.000 Zeilen usw.

Wählen Sie den Aggregationsmodus für Segmente aus, indem Sie fetchMoreData mit aggregateSegments = true aufrufen.

Sie können ermitteln, ob Daten vorhanden sind, indem Sie die Existenz von dataView.metadata.segment überprüfen:

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

Anhand von options.operationKind können Sie auch überprüfen, ob es sich um das erste Update oder um ein späteres Update handelt. Im folgenden Code bezieht sich VisualDataChangeOperationKind.Create auf das erste Segment und VisualDataChangeOperationKind.Append auf die nachfolgenden Segmente.

// 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
}

Sie können die Methode fetchMoreData auch über einen Ereignishandler für die Benutzeroberfläche aufrufen:

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
        }
    }
}

Als Antwort auf das Aufrufen der this.host.fetchMoreData-Methode ruft Power BI die update-Methode des Visuals mit einem neuen Datensegment auf.

Hinweis

In Power BI ist die insgesamt abrufbare Datenmenge auf 100 MB beschränkt, um Speichereinschränkungen auf dem Client zu vermeiden. Wenn dieser Grenzwert erreicht ist, gibt fetchMoreData()false zurück.

Modus für inkrementelle Updates

Im Modus für inkrementelle Updates enthält die Datenansicht, die für das Visual bereitgestellt wird, nur den nächsten Satz inkrementeller Daten. Die Größe der Datenansicht ist gleich der definierten Fenstergröße (oder kleiner, wenn das letzte Stück der Daten kleiner als die Fenstergröße ist). Wenn z. B. insgesamt 101.000 Zeilen erwartet werden und die Fenstergröße auf 10.000 Zeilen festgelegt ist, erhält das Visual 10 Updates mit einer Datenansichtsgröße von 10.000 Zeilen und ein Update mit einer Datenansichtsgröße von 1.000.

Der Modus für inkrementelle Updates wird ausgewählt, indem fetchMoreData mit aggregateSegments = false aufgerufen wird.

Sie können ermitteln, ob Daten vorhanden sind, indem Sie die Existenz von dataView.metadata.segment überprüfen:

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

Anhand von options.operationKind können Sie auch überprüfen, ob es sich um das erste Update oder um ein späteres Update handelt. Im folgenden Code bezieht sich VisualDataChangeOperationKind.Create auf das erste Segment und VisualDataChangeOperationKind.Segment auf die nachfolgenden Segmente.

// 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
}

Sie können die Methode fetchMoreData auch über einen Ereignishandler für die Benutzeroberfläche aufrufen:

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
        }
    }
}

Als Antwort auf das Aufrufen der this.host.fetchMoreData-Methode ruft Power BI die update-Methode des Visuals mit einem neuen Datensegment auf.

Hinweis

Obwohl die Daten in den verschiedenen Updates der Datenansichten überwiegend unterschiedlich sind, gibt es Überlappungen bei aufeinanderfolgenden Datenansichten.

Bei tabellarischen und kategorischen Datenzuordnungen kann davon ausgegangen werden, dass die ersten N-Datenansichtszeilen Daten enthalten, die aus der vorherigen Datenansicht kopiert wurden.

N kann bestimmt werden durch: (dataView.table['lastMergeIndex'] === undefined) ? 0 : dataView.table['lastMergeIndex'] + 1

Das Visual behält die Datenansicht bei, die ihm übergeben wird, sodass es ohne zusätzliche Kommunikation mit Power BI auf die Daten zugreifen kann.

Benutzerdefinierte Datenreduzierung

Da der Entwickler nicht immer im Voraus wissen kann, welche Art von Daten mit dem Visual angezeigt wird, möchte er dem Berichtsautor möglicherweise erlauben, die Größe des Datenblocks dynamisch festzulegen. Ab API-Version 5.2 können Sie dem Berichtsautor erlauben, die Größe der Datenblöcke festzulegen, die auf einmal abgerufen werden.

Damit der Berichtsautor die Anzahl festlegen kann, definieren Sie zunächst ein Eigenschaftenbereichsobjekt mit dem Namen dataReductionCustomization in der Datei 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
                }
            }
        }
    },

Definieren Sie dann nach den dataViewMappings die Standardwerte für dataReductionCustomization.

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

Die Informationen zur Datenreduzierung werden im Formatbereich unter Visual angezeigt.

Screenshot of the format pan with option to set data reduction count.

Überlegungen und Einschränkungen

  • Die Fenstergröße ist auf einen Bereich von 2 bis 30.000 Zeilen beschränkt.

  • Die Gesamtanzahl der Zeilen für eine Datenansicht ist auf 1.048.576 Zeilen begrenzt.

  • Im Segmentaggregationsmodus ist die Größe des Datenansichtsspeichers auf 100 MB beschränkt.

Nächste Schritte