[Bug]: [Python] WriteToJson silently rounds floats to 10 decimal places
Les mainteneurs répondent en général sous 1 jour
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 62/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- json, pandas, python, yaml
- Domaine
- data-engineering
Piste de recherche
L'arrondi provient du chemin DataFrame : WriteToJson dans sdks/python/apache_beam/io/textio.py transmet les kwargs à apache_beam.dataframe.io.to_json, qui appelle to_json de pandas, dont double_precision vaut 10 par défaut. Commence par reproduire le problème avec le pipeline YAML de l'issue, puis vérifie comment textio.py construit l'appel à to_json. C'est terminé lorsque les floats font un aller-retour sans perte (une valeur par défaut de double_precision adaptée ou un chemin json.dumps pour la sortie ligne par ligne) et qu'un test dans les tests de textio ou de dataframe io couvre 0.1234567890123.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
What happened?
beam.io.WriteToJson (and Beam YAML WriteToJson) silently loses float precision: values are rounded to 10 decimal places.
| input | written |
|---|---|
0.1234567890123 |
0.123456789 |
3.3333333333333335 |
3.3333333333 |
12345678901.5 |
12345678901.5 |
There is no warning, so a JSON export doesn't round-trip and differs from the same data written with WriteToParquet, WriteToCsv or json.dumps.
Minimal reproducer (Beam YAML, Beam 2.75.0; WriteToJson on master @ 728ef1b4 has the same code path):
pipeline:
type: chain
transforms:
- type: Create
config:
elements:
- {id: 1, x: 0.1234567890123}
- {id: 2, x: 3.3333333333333335}
- type: WriteToJson
config:
path: /tmp/c5
python -m apache_beam.yaml.main --yaml_pipeline_file=c5.yaml writes:
{"id":1,"x":0.123456789}
{"id":2,"x":3.3333333333}
Cause
WriteToJson (sdks/python/apache_beam/io/textio.py) writes through the DataFrame API, apache_beam.dataframe.io.to_json -> pandas.DataFrame.to_json, and only forwards the caller's **kwargs. pandas' to_json defaults to double_precision=10, so every float is rounded to 10 decimal places.
Options:
- Default
double_precision=15(pandas' maximum) when the caller doesn't pass it. That fixes most cases but still isn't exact for 16-17 significant digits. - Write JSON lines with
json.dumpsfororient='records', lines=True(the YAML default), which round-trips floats exactly.
At minimum the docstring should mention the rounding and the double_precision kwarg. Happy to send a PR for whichever approach maintainers prefer.
Issue Priority
Priority: 2 (default / most bugs should be filed as P2)
Issue Components
- Component: Python SDK
- Component: Java SDK
- Component: Go SDK
- Component: Typescript SDK
- Component: IO connector
- Component: Beam YAML
- Component: Beam examples
- Component: Beam playground
- Component: Beam katas
- Component: Website
- Component: Infrastructure
- Component: Spark Runner
- Component: Flink Runner
- Component: Prism Runner
- Component: Twister2 Runner
- Component: Hazelcast Jet Runner
- Component: Google Cloud Dataflow Runner
- Langage dominant
- Java
- Étoiles
- 8.7k
- Forks
- 4.8k
- Merge moyen
- 2 j 12 h
- PR mergées (30 j)
- 371
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de apache/beam
-
Release notes links wrongOuverteawaiting triage bug P3
Difficulté 1/5 Moins d'une heure Accessibilité débutants 67/100
apache/beam#41197 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
apache/beam#39624 · 2 réactions ·
Les mainteneurs répondent en général sous 1 jour
-
[Bug]: PubsubIO used in batch incorrect batch cutoff sizePeut-être pris @1fanwang l’a pris il y a 78 jours. Ouvertebug io P3 pinned pubsub
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
apache/beam#28011 · 4 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
build P3 sub-task
Difficulté 1/5 Moins d'une heure Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour
-
bug gcp io java P3
Difficulté 1/5 Moins d'une heure Accessibilité débutants 65/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de apache/beam
Issues similaires
-
Enhancing the Issue TemplateOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
SasanLabs/VulnerableApp#912 ·
Les mainteneurs répondent en général sous 1 jour
-
area/build area/events area/storage area/storage/kafkasql area/storage/sql
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Apicurio/apicurio-registry#11079 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
OpenAEV-Platform/openaev#9139 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 1 jour
-
desktop edt not responding
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100