Vous essayez de charger dans la RAM trop de données . Vous devez d'abord réduire la quantité de données que SQL vous récupère avant qu'elles n'atteignent Spark et optimisez-le à l'aide de paramètres spark, par exemple partitions .
Envisagez une ou plusieurs de ces optimisations :
- Spécifier dans
SELECT
quelles colonnes afficher explicitement, uniquement celles dont vous avez besoin, si possible ; - (Requête brute) Boucle dans un
while
cycle jusqu'à ce que vous puissiezfetch
rangées en bouclant chaque rangée. Les techniques suivantes pourraient fonctionner en définissant une constanten_rows
lire en mémoire et mettre à jouri
indexer chaque cycle :
LIMIT i,i+n_rows
BETWEEN i AND i+n_rows
WHILE primaryKey >= i AND primaryKey < i+n_rows
- Utiliser des partitions . Utilisez
partitionColumn
,lowerBound
,upperBound
etnumPartitions
(Référence 1) et (Référence 2) :
partitionColumn
sélectionnez la colonne qui sera utilisée pour déterminer comment diviser les données (par exemple, la clé primaire ).
lowerBound
établit la valeur minimale de partitionColumn
qui sera récupéré.
upperBound
établit la valeur maximale de partitionColumn
qui sera récupéré.
numPartitions
signifie le nombre de connexions parallèles que vous souhaitez définir pour lire les données via RDBMS.
Ainsi, Spark récupérera vos ensembles de données en utilisant les lignes que vous obtiendriez si vous faisiez SELECT * FROM table WHERE partitionColumn BETWEEN lowerBound AND upperBound
.