Skip to main content

Open ideas have been reviewed by our Product Management and are open for commenting and voting.

Filter by idea status

Filter by product area

4586 Ideas

vlroyrenn
Enthusiast
vlroyrennEnthusiast

Introduce a manual equivalent to SchemaScanner (SchemaCreator)Open

Context: Schema featuresWhen dealing with dynamic workflows, FME introduces the need to work with schema features, which are used by some transformers to recognize all the “columns” (attribute types, list attributes, struct fields with their types, geometry type, etc.) to be found in incoming features. SchemaScanner is able to generate those from data of an unknown type by (as the name suggest) scanning the first N lines of data and assuming it is representative of the rest. Dynamic input nodes for Custom Transformers also can’t know the schema of incoming features unless a schema feature is supplied.The Problem: Making/getting schema features (when you know your schema)The thing is, even in dynamic workspaces, users tend to have some notion of what their data format is at any given point (as can be previewed by looking at cached features in FME Form, and especially if AttributeManager is used to set attribute types), yet getting a schema feature representative of that known format is fairly difficult. Official tutorials reccomend making one by hand, using an AttributeCreator, which basically achieves the same result as the “User Attributes” tab of a FeatureWriter, only much more clumsily and difficult to keep up to date when attributes are added or removed. FME deliberately avoids exposing enough information to bridge that gap in Python or something similar.The Solution: SchemaCreator?FME should probably have a transformer that’s a cross between a SchemaScanner and a FeatureReader: a transformer that recieves features and outputs a single schema feature, before reoutputting the input features. Unlike SchemaScanner, though, the schema definition would be static, defined by the user (or detected automatically) using a Feature Type menu mostly identical to what is used by FeatureWriter, with the cached input feature values used to provide type suggestions.A mock-up of the basic idea. The interface only needs to reproduce the Feature Type menu used by writers and FeatureWriter, and for the transformer to output it as-is on the <Schema> port. 

vlroyrenn
Enthusiast
vlroyrennEnthusiast

Add color-coding/visual cue for bulk mode and what connections use itOpen

Feature transmission is something I’ve noticed to be a common cause for slowdowns in my flows (especially with Python), and one important way to keep execution time down is to make sure that features are transmitted in bulk mode.The only list of what does and doesn’t support Bulk mode is this one, which is long outdated.That leave log messages like “Splitting bulk features into individual features” as the main way through which users are meant to figure out what does and doesn’t use Bulk mode, which are easily missed and don’t really give a complete view of data flow. Worse, this is often conditionnal, as a Postges FeatureWriter is able to insert features in bulk mode, but upserting falls back to individual features.Adding a visual cue (whether only while running the flow, or also in edit mode if that information is known) would help. Some possibilities on top of my head:A crow’s foot, like they use in UML for many-to-many/many-to-one relations, in this case indicating that both sides support bulk mode or that one supports it and the other will have to split it.Colored lines while running the workspace to indicate which connections are actually sending data as feature tables, with colors near the recieving node if it ends up splitting the features recieved. Some kind of marching ants animation when funning the flow to show features being sent, vs a moving gradient similar to Windows indeterminate progress bars for bulk mode if using colors isn’t an option, perhaps?Giving some form of visual indication would go a long way in demistifying the feature for most users, I believe.

vlroyrenn
Enthusiast
vlroyrennEnthusiast

Intoduce a Python Dataframe Creator/TransformerOpen

FME's Python interface for feature attribute manipulation seems to be mainly oriented towards small datasets, as attributes are always only accessed field by field and feature by feature. Python has a very large ecosystem around data science and data processing of very large tables, so it's often practical to load data in a dataframe and run all your computations on the dataset as a whole, to benefit from various performance optimizations around vectorization, not to mention use of fammiliar tools for people in the data science field.Right now, loading features into a dataframe (I'm talking hundreds of columns and hundreds of thousands of rows, millions of cells) is both slow and very error-prone for a few reasons:Loss of schema information: getAttributeType() in the Python API can't return the full set of FME feature types, so dynamic workbenches can't properly handle things like dates unless a lot of work is done around schema detection and handling.Difficult to parse timestamp format: Python's standard library and most dataframe libraries can only parse fractionnal seconds up to 6 decimals, while FME does up to 9 and DatetimeNow() notably provides 7 decimals. This is a difficult problem on its own, but time series are common in the data science field, so it's especially noticeable here.Attribute access is per-row and field-by-field (slow): With no way to do bulk access on features, the data is accessed and converted value by value (save for lists, which can be accessed as a whole). If you have several million fields to read, that's a lot of slow python code running in very tight loops.Null and missing values are distinct and need to be checked separately: getAttribute() only returns None on missing values. When encountering a null value, it returns an empty string, which can throw off dataframe libraries and need to be checked for each value suceptible of returning null, adding to the overhead.Feature output is also per row and per feature: It's also very slow, and I belive it also blocks on waiting for downstream.Using files to pass data between nodes is a lot to ask: You can use feature readers and writers to create temporary files so that Python could load and dump these features in one shot, but even if I could get it to work (I haven't), it wouldn't be worth the dozen of extra nodes needed to make this work and all the visual clutter that creates.The easy way this could be resolved, in my eyes, is to simply provide a new Python transformer (the titular DataframeTransformer) that already does the conversion of features to and from dataframes and only provides the user's code with said dataframe.There have been efforts lately to create a standard dataframe interchange protocol throughout the Python ecosystem to encourage interoperability across libraries and avoid locking-in users into using a specific library, which Pandas supports converting to and reading from. To avoid depending on Pandas and/or its APIs, fmeobjects could expose some hypothetical "FeatureDataframe" object and leave it up to the users to load it into their dataframe library of choice.Related questions[...] my results are in a Pandas DataFrame. There's any way to convert that table to features to use in FME?Bulk feature marshalling/unmarshalling from FME to Python